1 Introduction

In our Project we want to present and compare production and emission values of different companies which are either state owned, investor owned or so called “nation state” owned over the time frame of 1854 until 2022. The companies in question all produce different resources, some of which are oil, gas, cement and a variety of different forms of coal. In short: They produce fossil fuel and related materials.

Especially in a modern world where the CO2 footprint is of importance and reduction of CO2 production is essential to comply with the goals set by leading scientists, taking a look at historical data can unravel some trends that continue to this date.

1.1 Used Data

The data used for this project stems from the GitHub Tidytuesday repository and was collected and compiled by Carbon Majors. In this analysis, we used the medium granularity dataset, which includes year, entity, entity type, commodity, commodity production, commodity unit, and total emissions but excludes the reporting entity, data point source, product emissions, and the four different operational emissions: flaring, venting, own fuel use, and fugitive methane.

1.2 Analysed Companies

The first table revolves around different companies which are producing different commodities and CO2 - emissions, their ownership and the type of commodity. It provides a short overview of all the analyzed companies, but excludes numerical data points as those would be to unwieldly. In total, 122 companies were analyzed in this dataset, differentiating between seven different commodities.

library(data.table)
library(DT)

datatable(Company)

2 Resource production Data

The first chapter revolves around the production of each resource per year. Important to note is, that not all resources were produced from 1854 onwards, but some were only discovered in later years. Also, when looking at the data it should be noted that different commodities were be produced in different units but still plotted in the same chart. The reason for this is simply to highlight the difference in production capacity of each resource type per year. The different used metrics were:

  1. Coal and cement production were measured in million tonnes/year.

  2. Natural Gas production was measured in bcm/year.

  3. Oil production was measured in bbl/year

2.1 Production per resource type

The first graph illustrates the annual production values of various commodities over time, highlighting key items such as different coal types (Anthracite, Bituminous, Sub-Bituminous, Lignite, and Thermal Coal), Natural Gas, Oil & NGL (Natural Gas Liquids), and Cement. The production value of Oil & NGL, represented by the yellow line, exhibits a pronounced increase beginning in the mid-20th century, establishing it as the leading contributor to global energy and industrial production.

library(tidyverse)
library(ggplot2)
library(dplyr)
library(plotly)

  economist_colors <- c(
  "Thermal Coal" = "#E3120B",  # Red
  "Anthracite Coal" = "#6A1B9A",
  "Lignite Coal" = "#FFEB3B",
  "Bituminous Coal" = "#FF5722",
  "Metallurgical Coal" = "#F4A6A0",
  "Sub-Bituminous Coal" = "#8B4513",
  "Oil & NGL" = "#0056A3",   # Blue
  "Natural Gas" = "#008F47",   # Green
  "Cement" = "#A5A5A5"  # Grey
  )

prod_year_source$commodity <- factor(prod_year_source$commodity, levels = names(economist_colors))

# Plot using plotly
plot_ly(prod_year_source, x = ~year, y = ~sum_prod_val, color = ~commodity, 
        colors = economist_colors, type = 'scatter', mode = 'lines') %>%
  layout(
    title = "Production value per year per resource type",
    xaxis = list(title = "Year"),
    yaxis = list(title = "Production Value"),
    legend = list(title = list(text = "resource type"))
  )

During this timeframe, listed commodities, particularly oil, natural gas, and coal, experienced substantial growth in production value, paralleling the economic expansion, industrialisation, and urbanisation that followed World War II. The preeminence of oil from the mid-20th century onward underscores its critical importance in energy generation, transportation, and industrial applications. Notably, Bituminous Coal (brown line) and Thermal Coal (gray line) demonstrated significant growth throughout the industrialisation era (1900–1950), reaching peaks in the mid to late 20th century, which corresponds with the extensive utilisation of coal for electricity generation and heavy industry.

2.2 Production values from 1940 to 2022

This revised graph emphasises the production values of various commodities from 1940 onward. The production value of Oil & NGL (yellow line) shows a remarkable surge post-1940, surpassing all other commodities by the late 20th century, indicative of the increasing global reliance on oil for transportation, industrial activities, and energy generation. This trend of high production value persists into the 21st century. Following 1940, the global energy landscape underwent a gradual transition from coal to oil and gas, propelled by technological innovations, economic development, and a rising demand for liquid fuels and cleaner energy alternatives.

library(ggplot2)
library(plotly)
library(dplyr)

  economist_colors <- c(
  "Thermal Coal" = "#E3120B",  # Red
  "Anthracite Coal" = "#6A1B9A",
  "Lignite Coal" = "#FFEB3B",
  "Bituminous Coal" = "#FF5722",
  "Metallurgical Coal" = "#F4A6A0",
  "Sub-Bituminous Coal" = "#8B4513",
  "Oil & NGL" = "#0056A3",   # Blue
  "Natural Gas" = "#008F47",   # Green
  "Cement" = "#A5A5A5"  # Grey
  )

prod_year_1940$commodity <- factor(prod_year_1940$commodity, levels = names(economist_colors))

#Plot 1940 onwards for showcasing increase after Industrialisation
plot_ly(prod_year_1940, x = ~year, y = ~sum_prod_val, color = ~commodity, colors = economist_colors, type = 'scatter', mode = 'lines') %>%
  layout(
    title = "Production per year per resource type from 1940",
    xaxis = list(title = "Year"),
    yaxis = list(title = "production value"),
    legend = list(title = list(text = "resource type"))
  )

2.3 Production Values without Oil, NGL and Gas

This graph illustrates the annual production value of various commodities, excluding Oil, NGL, and Gas, thereby offering a more focused perspective on resources such as coal in its various forms, cement, and metallurgical products.

library(ggplot2)
library(plotly)
library(dplyr)

  economist_colors <- c(
  "Thermal Coal" = "#E3120B",  # Red
  "Anthracite Coal" = "#6A1B9A",
  "Lignite Coal" = "#FFEB3B",
  "Bituminous Coal" = "#FF5722",
  "Metallurgical Coal" = "#F4A6A0",
  "Sub-Bituminous Coal" = "#8B4513",
  "Oil & NGL" = "#0056A3",   # Blue
  "Natural Gas" = "#008F47",   # Green
  "Cement" = "#A5A5A5"  # Grey
  )

prod_year_1940$commodity <- factor(prod_year_1940$commodity, levels = names(economist_colors))
#Plot all commodities excluding Gas and Oil due tu overwhelming superiority
plot_ly(prod_year_exc, x = ~year, y = ~sum_prod_val, color = ~commodity, colors = economist_colors, type = 'scatter', mode = 'lines') %>%
  layout(
    title = "Production value per year per resource type excluding Oil, NGL and Gas",
    xaxis = list(title = "Year"),
    yaxis = list(title = "production value"),
    legend = list(title = list(text = "resource type"))
  )

A comprehensive analysis of the observed trends shows:

  1. ⁠ ⁠Among the excluded commodities, Bituminous coal stands out as the leading product, experiencing a significant increase in production beginning in the 1960s, reaching its peak around 2010, followed by a slight decline. This trend underscores its ongoing relevance in energy generation and industrial applications, particularly in developing nations that depend on coal-fired power facilities.

  2. ⁠The production value of cement has seen substantial growth since the 1980s, with a notable acceleration in the 2000s. This surge is a mark of a global infrastructure and construction boom, as well as rapid urbanisation and industrialisation in developing contries.

  3. ⁠Thermal coal displays a gradual increase simular to that of Bituminous coal, although it maintains a lower overall production value, reflecting its specific applications within certain energy sectors.

  4. ⁠The production of metallurgical coal has shown consistent growth, closely linked to advancements in infrastructure and industrial development.

  5. ⁠In contrast, Lignite coal has experienced limited growth relative to other coal types, which can be attributed to its specialised applications.

  6. ⁠Both Anthracite Coal and Sub-Bituminous Coal reveal relatively stable trends, suggesting lower production values and minimal growth when compared to other commodities.

These observations indicate that, despite a global movement towards cleaner energy sources, coal, particularly Bituminous and Thermal Coal, continues to play a crucial role in numerous economies. Additionally, the growth in cement production reflects an ongoing demand for construction materials, driven by urbanisation, industrialisation and infrastructure initiatives. However, the relatively stable trends for certain coal types and metallurgical products imply a potential shift in resource priorities over time, with a focus on materials that are in higher demand and offer greater versatility.

2.4 Production values including total production

Total Production Value: Since the mid-20th century, there has been a significant increase in total production value, that serves as an indication of the overall growth of various resources. This increase is primarily attributed to Oil & NGL and Natural Gas, which are the predominant contributors to the total. It is essential to note, that the combined units varied, meaning that the figure does not reflect an exact value but rather illustrates the general trend over the years.

library(ggplot2)
library(plotly)
library(dplyr)

  economist_colors <- c(
  "Thermal Coal" = "#E3120B",  # Red
  "Anthracite Coal" = "#6A1B9A",
  "Lignite Coal" = "#FFEB3B",
  "Bituminous Coal" = "#FF5722",
  "Metallurgical Coal" = "#F4A6A0",
  "Sub-Bituminous Coal" = "#8B4513",
  "Oil & NGL" = "#0056A3",   # Blue
  "Natural Gas" = "#008F47",   # Green
  "Cement" = "#F5F5DC",  # Grey
  "total" = "#A5A5A5"
  )

prod_year_1940$commodity <- factor(prod_year_1940$commodity, levels = names(economist_colors))


#Plot all commodities including total production
plot_ly(total_prod_joined, x = ~year, y = ~sum_prod_val, color = ~commodity, colors = economist_colors, type = 'scatter', mode = 'lines') %>%
  layout(
    title = "Production value per year per resource type including total",
    xaxis = list(title = "Year"),
    yaxis = list(title = "production value"),
    legend = list(title = list(text = "resource type"))
  )

3 Comparison of production between early 20th and 21st century

These charts illustrate the summarized produced commodities in 1900 - 1922 against 2000 - 2022. They showcase the progress in production that has been achieved in the last century magnifying the enormous change that has happened. Especially when taking a closer look at the percentage change between the production in the 20th century compared to the 21st century, a clear shift away from coal and towards Oil and NGL can be observed.

library(dplyr)
library(plotly) 
        
#1. Aggregate the data
sum_data_1922_1 <- sum_data_1922 %>%
  group_by(commodity) %>%
  summarise(total_production = sum(sum_prod_val, na.rm = TRUE)) %>%
  arrange(desc(total_production))

# 2. Select the top 8 commodities
top_commodities <- sum_data_1922_1 %>% 
  slice_head(n = 8)

# Calculate percentages
top_commodities <- top_commodities %>%
  mutate(percent = total_production / sum(total_production) * 100)

# 3. Create the interactive pie chart
pie_chart <- plot_ly(
  data = top_commodities,
  labels = ~commodity,
  values = ~total_production,
  type = 'pie',
  textinfo = 'label+percent',       # Display both label and percent on the pie
  insidetextorientation = 'horizontal', # Make text inside horizontal
  hoverinfo = 'label+percent+value', # Tooltip shows label, percent, and value
  marker = list(colors = colorRampPalette(c(
  "#0056A3",      # Natural Gas
  "#FF5722",       # Oil & NGL
  "#008F47",     # Bituminous coal
  "#FF0000",       # Cement
  "lightblue",  # Metallurgical Coal
  "#FFEB3B", # Sub - Bituminous coal
  "grey",        # Lignite Coal
  "purple",     # Thermal Coal
  "pink"        # Anthracite Coal
))(8)) # Custom colors
) %>%
  layout(
    title = "Top 8 Commodities by Total Production",
    showlegend = TRUE,
    legend = list(title = list(text = "resource type")),
    margin = list(l = 50, r = 50, t = 50, b = 50) # Add padding for labels
  )

# Display the pie chart
pie_chart
library(dplyr)
library(plotly) 
        
#1. Aggregate the data
sum_data_2022_1 <- sum_data_2022 %>%
  group_by(commodity) %>%
  summarise(total_production = sum(sum_prod_val, na.rm = TRUE)) %>%
  arrange(desc(total_production))

# 2. Select the top 8 commodities
top_commodities <- sum_data_2022_1 %>% 
  slice_head(n = 9)

# Calculate percentages
top_commodities <- top_commodities %>%
  mutate(percent = total_production / sum(total_production) * 100)

# 3. Create the interactive pie chart
pie_chart2 <- plot_ly(
  data = top_commodities,
  labels = ~commodity,
  values = ~total_production,
  type = 'pie',
  textinfo = 'label+percent',       # Display both label and percent on the pie
  insidetextorientation = 'horizontal', # Make text inside horizontal
  hoverinfo = 'label+percent+value', # Tooltip shows label, percent, and value
  marker = list(colors = colorRampPalette(c(
  "#008F47",      # Natural Gas
  "#0056A3",       # Oil & NGL
  "#FF5722",     # Bituminous coal
  "#81C784",       # Cement
  "#FFEB3B",  # Metallurgical Coal
  "lightblue", # Sub - Bituminous coal
  "grey",        # Lignite Coal
  "#FF0000",     # Thermal Coal
  "pink",        # Anthracite Coal
  "purple"
))(9)) # Custom colors
) %>%
  layout(
    title = "Top 9 Commodities by Total Production",
    showlegend = TRUE,
    legend = list(title = list(text = "resource type")),
    margin = list(l = 50, r = 50, t = 50, b = 50) # Add padding for labels
  )

# Display the pie chart
pie_chart2

However, the showcased percentage points and thus the indicated lower production of all commodities revolving arround coal are misleading due to the exponential increase in total production that occurred over the last century. As a matter of fact, the coal production did increase from the 20th towards the 21st century. However it just did not increase in exponential fashion but more linear. Thus, a more detailed analysis shows:

  1. The percentage of Oil and NGL production is lower in 21st century compared to the 20th century. This by no means says, that the total production is reduced, but it showcases just how much natural Gas is produced to this day.

  2. Oil, NGL & Gas make up 87.2 % of all produced commodities in 21st century showcasing their relevance today, while back in the 20th century, production was more diverse with four major players. All of those major players participating over 10% with two of which even participating over 20% to the total production. When comparing the charts it becomes clear that, Oil and NGL were dominating already and continued their dominance, whilst bituminous coal has lost almost 20 %. Natural gas has clearly risen from 12.5% to most produced commodity with a total of 45 %.

  3. The majority of coal classes never showed a huge percentage of total production and did also not catch up, whilst some even lost relevance over the course of the century.

  4. Cement was not produced until the mid 20th century, however it also did not exceeded a participation to the total production of 3.4% during the time it was produced making it only a minor player. However it is important to note that it still is one of three resource types that increased in percentage total production.

Concluding it can be said that the production did change in the last century, mainly all analyzed commodities increased their total production volume, however the percentage showcased one major winner and one major looser during the last decade. All other commodities did gain or lose a few percentage points, but no striking change was noted.

4 Comparison of total emission versus total production

Comming to an end of the analysis of total production we wanted to compare the total production summarized versus the total emission. First of all, it has to be denoted that the summarized production consists of a summary of different units and is thus only an estimation, while the summarized emissions consist of one single unit and are thus precice.

library(plotly)
library(dplyr)

plot_ly(total_emiss_prod, x = ~year, y = ~value , color = ~category, colors = "Set1", type = 'scatter', mode = 'lines') %>%
  layout(
    title = "Production value per year per resource type including total",
    xaxis = list(title = "Year"),
    yaxis = list(title = "Emission value"),
    legend = list(title = list(text = "resource type"))
  )

When analyzing the data an almost exponential increase of production values can be seen while the emission values lag behind. However, they still show a similar pattern indicating a correlation between high production and high emission. When comparing the two curves one clear distinction can be observed.

While the production values show very sharp drops and rapid reconsolidation, the emission values seem to be a bit less dynamic. They do not spike as highly but do not drop as sharply indicating a decoupling between production and emission. The argument becomes more compelling when evaluating the last 10 years. While production continues to rise, emissions stagnate, though a trend reversal can not be observed as of yet.

5 Analysis of Emission Data

5.1 Total emissions by ownership and resource type

This bar chart presents the total emissions (measured in MtCO2e) categorized by three types of ownership: Investor-owned Companies, Nation States, and State-owned Entities. The emissions data is further categorized by resource type, which includes Coal (indicated in red), Gas (indicated in green), Oil (indicated in blue), and Other (indicated in gray). The primary findings are as follows:

  1. ⁠The emissions from investor-owned companies are predominantly derived from Oil and Gas, with a lesser contribution from coal.

  2. ⁠For nation-owned companies, coal is the principal source of emissions, with Oil and Gas contributing to a lesser extent.

  3. ⁠State-owned companies primarily generate emissions from Oil, with total emissions being considerably higher than those from privately owned companies, yet still lower than those from nation-owned entities.

A potential explanation for these trends is that investor-owned companies tend to operate on a smaller scale with a focus on profitability. In contrast, nation-owned companies may prioritize energy security and emphasize energy production from domestic resources. A similar rationale may apply to state-owned companies, which often oversee the national oil and gas sectors and serve as a crucial revenue source for many governments.

library(tidyverse)
library(ggplot2)
library(dplyr)
library(plotly)
#open the data
data <- emissions
#filtering the last 50 years
latest50_years = max(data$year)
data <-data %>%
  filter( year >= (latest50_years- 50))
# categorized commodities
data$resource_type <- ifelse(
  data$commodity == "Oil & NGL", "Oil",
  ifelse(
    data$commodity == "Natural Gas", "Gas",
    ifelse(
      data$commodity %in% c("Metallurgical Coal", "Anthracite Coal" , 
                            "Bituminous Coal","Sub-Bituminous Coal",
                            "Thermal Coal" ,"Lignite Coal" ), "Coal",
      "Other"
    )
  )
)
#summery for ownership and commodity into emmisions
summary_data <- data %>%
  group_by(parent_type,resource_type) %>%
  summarise(emissions_MtCO2e = sum(total_emissions_MtCO2e, na.rm = TRUE))%>%
  ungroup()
# Colors
economist_colors <- c(
  "Coal" = "#E3120B",  # Bold red
  "Oil" = "#0056A3",   # Bold blue
  "Gas" = "#008F47",   # Bold green
  "Other" = "#A5A5A5"  # Neutral gray
)

# BAR CHART
static_plot <- ggplot(summary_data, aes(
  x = parent_type, 
  y = emissions_MtCO2e, 
  fill = resource_type, 
  text = paste0(
    "Ownership: ", parent_type, 
    "<br>Resource: ", resource_type, 
    "<br>Emission: ", round(emissions_MtCO2e, 2), " MtCO2e"
  )
)) +
  geom_bar(stat = "identity", position = "stack", width = 0.7) +  # Adjust bar width
  labs(
    title = "Total Emissions by Ownership and Resource Type",
    subtitle = "Stacked emissions across different ownership categories",
    x = "Ownership",
    y = "Total Emissions in MtCO2",
    fill = "Resource Type"
  ) +
  scale_fill_manual(values = economist_colors) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", size = 16, color = "black"),
    plot.subtitle = element_text(size = 12, color = "black"),
    axis.title.x = element_text(size = 12, color = "black"),
    axis.title.y = element_text(size = 12, color = "black"),
    axis.text = element_text(size = 10, color = "black"),
    legend.position = "top",                                          
    legend.title = element_text(size = 12),
    legend.text = element_text(size = 10),
    panel.background = element_rect(fill = "white", color = NA),    
    plot.background = element_rect(fill = "white", color = NA),     
    panel.grid.major.y = element_line(color = "grey80", linetype = "dotted"),  
    panel.grid.major.x = element_blank(),                             
    panel.border = element_blank()
  )

# Convert to interactive plot 
interactive_plot <- ggplotly(static_plot, tooltip = "text")

interactive_plot

5.2 Yearly emissions by resource type type

A new chart presents an analysis of annual emissions categorized by commodity type from 1900 to 2025, specifically focusing on Coal, Gas, Oil, and Other resources. This graph effectively integrates data from State-owned Entities and Nation States. The principal findings are as follows:

  1. ⁠Coal continues to be the predominant source of emissions, followed by Oil, with Gas contributing less significantly and Other resources having minimal impact.

  2. ⁠ ⁠A notable surge in emissions across all resource categories is observed beginning in the mid-20th century.

  3. ⁠ ⁠While coal emissions are substantial, there is a marked increase in oil emissions post-mid-20th century, and gas emissions exhibit a more gradual rise.

Several factors may explain these trends. Coal served as the foundation of the industrial revolution and maintained its status as the primary energy source for many years due to its availability and affordability. It became the leading fuel for power generation worldwide, with its usage peaking in the late 20th century to match with rising electricity demands.

The peak period for oil emissions occurred from the late 20th century to the early 21st century, coinciding with the global expansion of transportation modes such as automobiles, aircraft, and shipping following World War II. Additionally, oil emerged as a crucial component in the production of plastics, chemicals, and synthetic materials, further escalating demand. The 1970s experienced significant increases in oil production and emissions, despite fluctuations in prices, largely due to the control exerted by state-owned entities in OPEC nations over a substantial portion of the global supply.

Natural gas has gained traction as a “cleaner” fossil fuel alternative to coal, resulting in a steady rise in emissions as nations shifted away from coal dependency. Numerous Nation States and State-owned Entities have made considerable investments in gas production, recognising it as a strategic energy resource, particularly in the 21st century. This upward trend in gas emissions is ongoing, reflecting consistent growth since the late 20th century.

library(tidyverse)
library(ggplot2)
library(dplyr)
library(plotly)
#open the data
#file_path <- "~/Desktop/Rproject/Emissions_m.csv"  
data_area <- emissions
# categorized commodities
data_area$resource_type <- ifelse(
  data_area$commodity == "Oil & NGL", "Oil",
  ifelse(
    data_area$commodity == "Natural Gas", "Gas",
    ifelse(
      data_area$commodity %in% c("Metallurgical Coal", "Anthracite Coal", 
                                 "Bituminous Coal", "Sub-Bituminous Coal",
                                 "Thermal Coal", "Lignite Coal"), "Coal",
      "Other"
    )
  )
)

#convert and reverse order for stacking
data_area$resource_type <- factor(data_area$resource_type, 
                                  levels = c("Other", "Gas", "Oil", "Coal"))  
# combine Nation and state-owned
filtered_data_area <- data_area %>%
  filter(parent_type %in% c("Nation State", "State-owned Entity"))

# sum of Emis by year+type
summary_data_area <- filtered_data_area %>%
  filter(!is.na(total_emissions_MtCO2e)) %>%
  group_by(year, resource_type) %>%
  summarise(emissions_MtCO2e = sum(total_emissions_MtCO2e, na.rm = TRUE)) %>%
  ungroup()

# Need to stack it
summary_data_area <- summary_data_area %>%
  arrange(year, resource_type) %>%
  group_by(year) %>%
  mutate(
    ymin = cumsum(emissions_MtCO2e) - emissions_MtCO2e,#lowe  
    ymax = cumsum(emissions_MtCO2e) #upper                     
  ) %>%
  ungroup()

# Economist-style colors
economist_colors <- c(
  "Coal" = "#E3120B",  # Red
  "Oil" = "#0056A3",   # Blue
  "Gas" = "#008F47",   # Green
  "Other" = "#A5A5A5"  # Grey
)

# PLOT
static_plot <- ggplot(summary_data_area, aes(x = year, group = resource_type)) +
  # 1 layer faded stacked area chart
  geom_ribbon(aes(
    ymin = ymin,
    ymax = ymax,
    fill = resource_type,
    text = paste0(
      "Year: ", year, 
      "<br>Resource: ", resource_type, 
      "<br>Emission: ", round(emissions_MtCO2e, 2)
    )
  ), alpha = 0.5) +
  # 2nd layer adding Lines 
  geom_line(aes(
    y = ymax,
    color = resource_type,
    text = paste0(
      "Year: ", year, 
      "<br>Resource: ", resource_type, 
      "<br>Emission: ", round(emissions_MtCO2e, 2)
    )
  ), size = 1, show.legend = FALSE) +  # Suppress legend for lines
  # 3rd layer adding label to a line
  labs(
    title = "Yearly Emissions for Nation and State owned",
    x = "Year",
    y = "Total Emissions in MtCO2",
    fill = "Resource Type",
    color = "Resource Type"
  ) +
  # coloring
  scale_fill_manual(values = economist_colors) +
  scale_color_manual(values = economist_colors) +
  scale_y_continuous(limits = c(0, NA), expand = expansion(mult = c(0, 0.05))) +
  #general look
  theme_minimal(base_size = 14) +
  theme(
    panel.background = element_rect(fill = "white", color = NA),
    panel.grid.major.y = element_line(color = "grey80", linetype = "dotted"),
    panel.grid.major.x = element_blank(),
    legend.position = "top",
    plot.background = element_rect(fill = "white", color = NA),
    axis.text = element_text(color = "black"),
    axis.title = element_text(color = "black")
  )

# convert to an interactive plot
interactive_plot <- ggplotly(static_plot, tooltip = "text") %>%
  layout(
    legend = list(
      title = list(text = "Resource Type"), 
      orientation = "v"
    ),
    showlegend = TRUE
  )

# Rename legend items to clean labels
interactive_plot$x$data <- lapply(interactive_plot$x$data, function(trace) {
  if (!is.null(trace$legendgroup)) {
    trace$name <- gsub(",1", "", trace$name)  # Remove ",1"
    trace$name <- gsub("\\(", "", trace$name)  # Remove "("
    trace$name <- gsub("\\)", "", trace$name)  # Remove ")"
  }
  trace
})


interactive_plot

5.3 Yearly emissions by resource type

The trends observed in investor-owned companies exhibit similarities to those of state or nation-owned entities, yet notable distinctions exist. Total emissions from investor-owned firms are comparatively lower than those from their state/nation-owned counterparts. The emissions profile of these companies is primarily influenced by oil and gas, with coal contributing minimally. This suggests a pronounced emphasis on market-driven resources, such as oil and gas, which tend to yield higher profits within the private sector.

In investor-owned firms, oil emissions are particularly prominent, peaking in conjunction with global industrial and transportation expansions. The private sector’s tendency towards oil is a sign of its profitability and robust demand in international markets. Although gas also plays a significant role, it remains secondary to oil. Its importance has grown in recent decades as private enterprises leverage its rising demand as a “transition fuel.” Conversely, coal’s contribution is considerably diminished, reflecting the private sector’s gradual shift away from coal in response to regulatory challenges and decreasing profitability.

In contrast, state or nation-owned entities exhibit significantly higher total emissions, with coal being the predominant source, while oil and gas also contribute substantially. These entities demonstrate a slower pace in moving away from fossil fuels, particularly coal, which may be attributed to political inertia, existing infrastructure, and economic dependence on state-managed resources. While investor-owned companies remain heavily reliant on oil and gas, they appear to be more agile in adapting to market dynamics and regulatory influences, potentially facilitating a more rapid transition towards cleaner energy alternatives.

library(tidyverse)
library(ggplot2)
library(dplyr)
#open the data
#file_path <- "~/Desktop/Rproject/Emissions_m.csv"  
data_area1 <- emissions
# Categorize the commodities
data_area1$resource_type1 <- ifelse(
  data_area1$commodity == "Oil & NGL", "Oil",
  ifelse(
    data_area1$commodity == "Natural Gas", "Gas",
    ifelse(
      data_area1$commodity %in% c("Metallurgical Coal", "Anthracite Coal", 
                                 "Bituminous Coal", "Sub-Bituminous Coal",
                                 "Thermal Coal", "Lignite Coal"), "Coal",
      "Other"
    )
  )
)

# Convert ⁠ resource_type1 ⁠ to a factor with the desired stacking order
data_area1$resource_type1 <- factor(data_area1$resource_type1, 
                                    levels = c("Other", "Gas", "Coal", "Oil"))

# Filter for Investor-owned companies only
filtered_data_area1 <- data_area1 %>%
  filter(parent_type == "Investor-owned Company")

# Summarize emissions by year and resource type
summary_data_area1 <- filtered_data_area1 %>%
  filter(!is.na(total_emissions_MtCO2e)) %>%
  group_by(year, resource_type1) %>%
  summarise(emissions_MtCO2e1 = sum(total_emissions_MtCO2e, na.rm = TRUE)) %>%
  ungroup()

# Calculate stacking (cumulative emissions)
summary_data_area1 <- summary_data_area1 %>%
  arrange(year, resource_type1) %>%
  group_by(year) %>%
  mutate(
    ymin = cumsum(emissions_MtCO2e1) - emissions_MtCO2e1,  # Lower bound of the ribbon
    ymax = cumsum(emissions_MtCO2e1)                      # Upper bound of the ribbon
  ) %>%
  ungroup()

# Economist-style colors
economist_colors <- c(
  "Oil" = "#0056A3",   # Blue
  "Coal" = "#E3120B",  # Red
  "Gas" = "#008F47",   # Green
  "Other" = "#A5A5A5"  # Grey
)

# Plot
static_plot1 <- ggplot(summary_data_area1, aes(x = year, group = resource_type1)) +
  # 1. Faded stacked area chart
  geom_ribbon(aes(
    ymin = ymin,
    ymax = ymax,
    fill = resource_type1,
    text = paste0(
      "Year: ", year, 
      "<br>Resource: ", resource_type1, 
      "<br>Emission: ", round(emissions_MtCO2e1, 2)
    )
  ), alpha = 0.5) +
  # 2. Line chart for the top of each ribbon
  geom_line(aes(
    y = ymax,
    color = resource_type1,
    text = paste0(
      "Year: ", year, 
      "<br>Resource: ", resource_type1, 
      "<br>Emission: ", round(emissions_MtCO2e1, 2)
    )
  ), size = 1, show.legend = FALSE) +  # Suppress legend for lines
  # 3. Labels
  labs(
    title = "Yearly Emissions for Investor-owned Companies",
    x = "Year",
    y = "Total Emissions in MtCO2",
    fill = "Resource Type",
    color = "Resource Type"
  ) +
  # Colors for both areas and lines
  scale_fill_manual(values = economist_colors) +
  scale_color_manual(values = economist_colors) +
  scale_y_continuous(limits = c(0, NA), expand = expansion(mult = c(0, 0.05))) +
  # Styling
  theme_minimal(base_size = 14) +
  theme(
    panel.background = element_rect(fill = "white", color = NA),
    panel.grid.major.y = element_line(color = "grey80", linetype = "dotted"),
    panel.grid.major.x = element_blank(),
    legend.position = "top",
    plot.background = element_rect(fill = "white", color = NA),
    axis.text = element_text(color = "black"),
    axis.title = element_text(color = "black")
  )

# Convert to interactive plot
interactive_plot1 <- ggplotly(static_plot1, tooltip = "text") %>%
  layout(
    legend = list(
      title = list(text = "Resource Type"), 
      orientation = "v"
    ),
    showlegend = TRUE
  )

# Rename legend items to clean labels
interactive_plot1$x$data <- lapply(interactive_plot1$x$data, function(trace) {
  if (!is.null(trace$legendgroup)) {
    trace$name <- gsub(",1", "", trace$name)  # Remove ",1"
    trace$name <- gsub("\\(", "", trace$name)  # Remove "("
    trace$name <- gsub("\\)", "", trace$name)  # Remove ")"
  }
  trace
})

# Display interactive plot
interactive_plot1

6 Conclusion

The examination of production values and emissions trends across different commodities reveals significant patterns in resource use, industrial development, and environmental repercussions over time.

Coal, especially Bituminous and Thermal Coal, was essential during the initial stages of industrialisation. Although its proportion in total energy production has diminished, it continues to hold importance, particularly in developing nations and state-driven energy frameworks. Since the mid-20th century, oil and natural gas liquids have consistently led in both production and emissions, largely due to their key role in transportation, energy generation, and industrial processes. Natural gas has emerged as a prominent alternative to coal, providing cleaner energy with reduced emissions while maintaining increasing production. Consequently, the period following World War II marked a significant transition from coal to oil and gas as the primary energy sources, influenced by technological progress, urbanisation, and economic globalisation.

Emissions from state-controlled entities are predominantly reliant on coal, reflecting extensive domestic energy initiatives aimed at ensuring energy security and fostering economic growth. This dependence on coal results in considerably higher emissions compared to those from investor-owned firms. In contrast, private sector companies tend to maintain a more diversified energy portfolio, drawing attention to oil and gas due to their profitability and market demand. These companies are also more adaptable to regulatory pressures, resulting in a lower reliance on coal.

Emissions trends closely follow production patterns, with peaks in coal-related emissions corresponding to the industrial expansion of the mid-20th century, while oil and gas emissions reached their peaks later. The gradual increase in natural gas production signifies its role as a “transition fuel,” offering lower emissions than coal while still contributing to overall carbon output.

The integrated analysis of production and emissions data underscores the intricate nature of global resource consumption and its environmental impacts. While there is a noticeable transition towards cleaner energy sources, exemplified by the increased use of natural gas and a reduction in coal dependency, this progress is inadequate to achieve the overarching global climate objectives.

LS0tCnRpdGxlOiAiRW1pc3Npb25zX0RhdGEiCmF1dGhvcjogIlBhdWwgUmV1w58gJiBBcnNlbmlpIE1va3JvdiIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAzCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0aGVtZTogZmxhdGx5CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBkZl9wcmludDogcGFnZWQKICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6ICczJwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAnMycKLS0tCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCgllY2hvID0gVFJVRSwKCW1lc3NhZ2UgPSBGQUxTRSwKCXdhcm5pbmcgPSBGQUxTRQopCm9wdGlvbnMoc2NpcGVuID0gMTUpCgpgYGAKCmBgYHtyIGxvYWQtd3JhbmdsZS1kYXRhLCBlY2hvID0gRkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGRwbHlyKQoKCiNzb3VyY2VfZGF0YSA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFpbi9kYXRhLzIwMjQvMjAyNC0wNS0yMS9lbWlzc2lvbnMuY3N2JykKCiNTYW1lIGRhdGEsIGV4Y2VwdCBmb3IgY29udmVyc2lvbiBvZiAiY3ViaWMgRmVldCIgdG8gIkN1YmljIE1ldGVycyIgZm9yIGNsYXJpZmljYXRpb24gcHVycG9zZXMKZmlsZV9wYXRoIDwtICJ+L0Rlc2t0b3AvUl9Qcm9qZWN0L2VtaXNzaW9ucy5jc3YiIAplbWlzc2lvbnMgPC0gcmVhZC5jc3YoZmlsZV9wYXRoLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCkNvbXBhbnkgPC0gdW5pcXVlKGVtaXNzaW9uc1tjKCJwYXJlbnRfZW50aXR5IiwgInBhcmVudF90eXBlIiwgImNvbW1vZGl0eSIpXSkKCiNUb3BpYyAxIGRhdGEgV3JhbmdsZSBhbmQgUHJlcApwcm9kX3llYXJfc291cmNlX3JhdyA8LSB1bmlxdWUoZW1pc3Npb25zW2MoImNvbW1vZGl0eSIsICJ5ZWFyIiwgInByb2R1Y3Rpb25fdmFsdWUiKV0pCnByb2RfeWVhcl9zb3VyY2UgPC0gcHJvZF95ZWFyX3NvdXJjZV9yYXcgJT4lCiAgZ3JvdXBfYnkoY29tbW9kaXR5LCB5ZWFyKSAlPiUKICBzdW1tYXJpc2Uoc3VtX3Byb2RfdmFsID0gc3VtKHByb2R1Y3Rpb25fdmFsdWUpKQoKcHJvZF95ZWFyXzE5NDAgPC0gcHJvZF95ZWFyX3NvdXJjZSAlPiUKICBmaWx0ZXIoeWVhciA+PSAxOTQwICYgeWVhciA8PSAyMDIyKQoKcHJvZF95ZWFyX2V4YyA8LSBwcm9kX3llYXJfc291cmNlICU+JSAKICBmaWx0ZXIoeWVhciA+PSAxOTQwICYgeWVhciA8PSAyMDIyKSAlPiUKICBmaWx0ZXIoIWNvbW1vZGl0eSAlaW4lIGMoIk5hdHVyYWwgR2FzIiwgIk9pbCAmIE5HTCIpKQoKcHJvZF95ZWFyX3JhdyA8LSB1bmlxdWUoZW1pc3Npb25zW2MoInllYXIiLCAicHJvZHVjdGlvbl92YWx1ZSIpXSkKdG90YWxfcHJvZF95ZWFyIDwtIHByb2RfeWVhcl9yYXcgJT4lCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXNlKHN1bV9wcm9kX3ZhbCA9IHN1bShwcm9kdWN0aW9uX3ZhbHVlKSkKdG90YWxfcHJvZF95ZWFyJGNvbW1vZGl0eSA8LSBjKCJ0b3RhbCIpCgp0b3RhbF9wcm9kX2pvaW5lZCA8LSBiaW5kX3Jvd3MocHJvZF95ZWFyX3NvdXJjZSwgdG90YWxfcHJvZF95ZWFyKQoKc3VtX2RhdGFfMTkyMl9yYXcgPC0gdW5pcXVlKGVtaXNzaW9uc1tjKCJjb21tb2RpdHkiLCAieWVhciIsICJwcm9kdWN0aW9uX3ZhbHVlIildKQpzdW1fZGF0YV8xOTIyIDwtIHN1bV9kYXRhXzE5MjJfcmF3ICU+JQogIGdyb3VwX2J5KGNvbW1vZGl0eSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKHN1bV9wcm9kX3ZhbCA9IHN1bShwcm9kdWN0aW9uX3ZhbHVlKSkgJT4lCiAgZmlsdGVyKHllYXIgPj0gMTkwMCAmIHllYXIgPD0gMTkyMikKCnN1bV9kYXRhXzIwMjJfcmF3IDwtIHVuaXF1ZShlbWlzc2lvbnNbYygiY29tbW9kaXR5IiwgInllYXIiLCAicHJvZHVjdGlvbl92YWx1ZSIpXSkKc3VtX2RhdGFfMjAyMiA8LSBzdW1fZGF0YV8yMDIyX3JhdyAlPiUKICBncm91cF9ieShjb21tb2RpdHksIHllYXIpICU+JQogIHN1bW1hcmlzZShzdW1fcHJvZF92YWwgPSBzdW0ocHJvZHVjdGlvbl92YWx1ZSkpICU+JQogIGZpbHRlcih5ZWFyID49IDIwMDAgJiB5ZWFyIDw9IDIwMjIpCgojVG9waWMgMiBkYXRhIFdyYW5nbGUgYW5kIFByZXAKZW1pc3NfeWVhcl9zb3VyY2VfcmF3IDwtIHVuaXF1ZShlbWlzc2lvbnNbYygiY29tbW9kaXR5IiwgInllYXIiLCAidG90YWxfZW1pc3Npb25zX010Q08yZSIpXSkKZW1pc3NfeWVhcl9zb3VyY2UgPC0gZW1pc3NfeWVhcl9zb3VyY2VfcmF3ICU+JQogIGdyb3VwX2J5KGNvbW1vZGl0eSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKHN1bV9lbWlzc192YWwgPSBzdW0odG90YWxfZW1pc3Npb25zX010Q08yZSkpCgplbWlzc195ZWFyXzE5NTAgPC0gZW1pc3NfeWVhcl9zb3VyY2UgJT4lCiAgZmlsdGVyKHllYXIgPj0gMTk1MCAmIHllYXIgPD0gMjAyMikKCmVtaXNzX3llYXJfcmF3IDwtIHVuaXF1ZShlbWlzc2lvbnNbYygieWVhciIsICJ0b3RhbF9lbWlzc2lvbnNfTXRDTzJlIildKQp0b3RhbF9lbWlzc195ZWFyIDwtIGVtaXNzX3llYXJfcmF3ICU+JQogIGdyb3VwX2J5KHllYXIpICU+JQogIHN1bW1hcmlzZShzdW1fZW1pc3NfdmFsID0gc3VtKHRvdGFsX2VtaXNzaW9uc19NdENPMmUpKQoKdG90YWxfZW1pc3NfeWVhciRjb21tb2RpdHkgPC0gYygidG90YWwiKQoKdG90YWxfZW1pc3Nfam9pbmVkIDwtIGJpbmRfcm93cyhlbWlzc195ZWFyX3NvdXJjZSwgdG90YWxfZW1pc3NfeWVhcikKCnRvdGFsX2VtaXNzX3Byb2QgPC0gYmluZF9yb3dzKHRvdGFsX2VtaXNzX3llYXIsIHRvdGFsX3Byb2RfeWVhcikgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHN1bV9wcm9kX3ZhbCwgc3VtX2VtaXNzX3ZhbCksIAogICAgICAgICAgICAgICBuYW1lc190byA9ICJjYXRlZ29yeSIsIAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUKICBmaWx0ZXIoIXZhbHVlICVpbiUgYyhOQSkpCgpgYGAKCiMgSW50cm9kdWN0aW9uCgpJbiBvdXIgUHJvamVjdCB3ZSB3YW50IHRvIHByZXNlbnQgYW5kIGNvbXBhcmUgcHJvZHVjdGlvbiBhbmQgZW1pc3Npb24gdmFsdWVzIG9mIGRpZmZlcmVudCBjb21wYW5pZXMgd2hpY2ggYXJlIGVpdGhlciBzdGF0ZSBvd25lZCwgaW52ZXN0b3Igb3duZWQgb3Igc28gY2FsbGVkICJuYXRpb24gc3RhdGUiIG93bmVkIG92ZXIgdGhlIHRpbWUgZnJhbWUgb2YgMTg1NCB1bnRpbCAyMDIyLiBUaGUgY29tcGFuaWVzIGluIHF1ZXN0aW9uIGFsbCBwcm9kdWNlIGRpZmZlcmVudCByZXNvdXJjZXMsIHNvbWUgb2Ygd2hpY2ggYXJlIG9pbCwgZ2FzLCBjZW1lbnQgYW5kIGEgdmFyaWV0eSBvZiBkaWZmZXJlbnQgZm9ybXMgb2YgY29hbC4gSW4gc2hvcnQ6IFRoZXkgcHJvZHVjZSBmb3NzaWwgZnVlbCBhbmQgcmVsYXRlZCBtYXRlcmlhbHMuCgpFc3BlY2lhbGx5IGluIGEgbW9kZXJuIHdvcmxkIHdoZXJlIHRoZSBDTzIgZm9vdHByaW50IGlzIG9mIGltcG9ydGFuY2UgYW5kIHJlZHVjdGlvbiBvZiBDTzIgcHJvZHVjdGlvbiBpcyBlc3NlbnRpYWwgdG8gY29tcGx5IHdpdGggdGhlIGdvYWxzIHNldCBieSBsZWFkaW5nIHNjaWVudGlzdHMsIHRha2luZyBhIGxvb2sgYXQgaGlzdG9yaWNhbCBkYXRhIGNhbiB1bnJhdmVsIHNvbWUgdHJlbmRzIHRoYXQgY29udGludWUgdG8gdGhpcyBkYXRlLgoKIyMgVXNlZCBEYXRhCgpUaGUgZGF0YSB1c2VkIGZvciB0aGlzIHByb2plY3Qgc3RlbXMgZnJvbSB0aGUgR2l0SHViIFRpZHl0dWVzZGF5IHJlcG9zaXRvcnkgYW5kIHdhcyBjb2xsZWN0ZWQgYW5kIGNvbXBpbGVkIGJ5IENhcmJvbiBNYWpvcnMuIEluIHRoaXMgYW5hbHlzaXMsIHdlIHVzZWQgdGhlIG1lZGl1bSBncmFudWxhcml0eSBkYXRhc2V0LCB3aGljaCBpbmNsdWRlcyB5ZWFyLCBlbnRpdHksIGVudGl0eSB0eXBlLCBjb21tb2RpdHksIGNvbW1vZGl0eSBwcm9kdWN0aW9uLCBjb21tb2RpdHkgdW5pdCwgYW5kIHRvdGFsIGVtaXNzaW9ucyBidXQgZXhjbHVkZXMgdGhlIHJlcG9ydGluZyBlbnRpdHksIGRhdGEgcG9pbnQgc291cmNlLCBwcm9kdWN0IGVtaXNzaW9ucywgYW5kIHRoZSBmb3VyIGRpZmZlcmVudCBvcGVyYXRpb25hbCBlbWlzc2lvbnM6IGZsYXJpbmcsIHZlbnRpbmcsIG93biBmdWVsIHVzZSwgYW5kIGZ1Z2l0aXZlIG1ldGhhbmUuCgojIyBBbmFseXNlZCBDb21wYW5pZXMKClRoZSBmaXJzdCB0YWJsZSByZXZvbHZlcyBhcm91bmQgZGlmZmVyZW50IGNvbXBhbmllcyB3aGljaCBhcmUgcHJvZHVjaW5nIGRpZmZlcmVudCBjb21tb2RpdGllcyBhbmQgQ08yIC0gZW1pc3Npb25zLCB0aGVpciBvd25lcnNoaXAgYW5kIHRoZSB0eXBlIG9mIGNvbW1vZGl0eS4gSXQgcHJvdmlkZXMgYSBzaG9ydCBvdmVydmlldyBvZiBhbGwgdGhlIGFuYWx5emVkIGNvbXBhbmllcywgYnV0IGV4Y2x1ZGVzIG51bWVyaWNhbCBkYXRhIHBvaW50cyBhcyB0aG9zZSB3b3VsZCBiZSB0byB1bndpZWxkbHkuIEluIHRvdGFsLCAxMjIgY29tcGFuaWVzIHdlcmUgYW5hbHl6ZWQgaW4gdGhpcyBkYXRhc2V0LCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBzZXZlbiBkaWZmZXJlbnQgY29tbW9kaXRpZXMuICAgCiAKYGBge3J9CmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShEVCkKCmRhdGF0YWJsZShDb21wYW55KQoKYGBgCgojIFJlc291cmNlIHByb2R1Y3Rpb24gRGF0YQpUaGUgZmlyc3QgY2hhcHRlciByZXZvbHZlcyBhcm91bmQgdGhlIHByb2R1Y3Rpb24gb2YgZWFjaCByZXNvdXJjZSBwZXIgeWVhci4gSW1wb3J0YW50IHRvIG5vdGUgaXMsIHRoYXQgbm90IGFsbCByZXNvdXJjZXMgd2VyZSBwcm9kdWNlZCBmcm9tIDE4NTQgb253YXJkcywgYnV0IHNvbWUgd2VyZSBvbmx5IGRpc2NvdmVyZWQgaW4gbGF0ZXIgeWVhcnMuIEFsc28sIHdoZW4gbG9va2luZyBhdCB0aGUgZGF0YSBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBkaWZmZXJlbnQgY29tbW9kaXRpZXMgd2VyZSBiZSBwcm9kdWNlZCBpbiBkaWZmZXJlbnQgdW5pdHMgYnV0IHN0aWxsIHBsb3R0ZWQgaW4gdGhlIHNhbWUgY2hhcnQuIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgc2ltcGx5IHRvIGhpZ2hsaWdodCB0aGUgZGlmZmVyZW5jZSBpbiBwcm9kdWN0aW9uIGNhcGFjaXR5IG9mIGVhY2ggcmVzb3VyY2UgdHlwZSBwZXIgeWVhci4gVGhlIGRpZmZlcmVudCB1c2VkIG1ldHJpY3Mgd2VyZToKCjEuIENvYWwgYW5kIGNlbWVudCBwcm9kdWN0aW9uIHdlcmUgbWVhc3VyZWQgaW4gbWlsbGlvbiB0b25uZXMveWVhci4KCjIuIE5hdHVyYWwgR2FzIHByb2R1Y3Rpb24gd2FzIG1lYXN1cmVkIGluIGJjbS95ZWFyLgoKMy4gT2lsIHByb2R1Y3Rpb24gd2FzIG1lYXN1cmVkIGluIGJibC95ZWFyCgojIyBQcm9kdWN0aW9uIHBlciByZXNvdXJjZSB0eXBlCgpUaGUgZmlyc3QgZ3JhcGggaWxsdXN0cmF0ZXMgdGhlIGFubnVhbCBwcm9kdWN0aW9uIHZhbHVlcyBvZiB2YXJpb3VzIGNvbW1vZGl0aWVzIG92ZXIgdGltZSwgaGlnaGxpZ2h0aW5nIGtleSBpdGVtcyBzdWNoIGFzIGRpZmZlcmVudCBjb2FsIHR5cGVzIChBbnRocmFjaXRlLCBCaXR1bWlub3VzLCBTdWItQml0dW1pbm91cywgTGlnbml0ZSwgYW5kIFRoZXJtYWwgQ29hbCksIE5hdHVyYWwgR2FzLCBPaWwgJiBOR0wgKE5hdHVyYWwgR2FzIExpcXVpZHMpLCBhbmQgQ2VtZW50LiBUaGUgcHJvZHVjdGlvbiB2YWx1ZSBvZiBPaWwgJiBOR0wsIHJlcHJlc2VudGVkIGJ5IHRoZSB5ZWxsb3cgbGluZSwgZXhoaWJpdHMgYSBwcm9ub3VuY2VkIGluY3JlYXNlIGJlZ2lubmluZyBpbiB0aGUgbWlkLTIwdGggY2VudHVyeSwgZXN0YWJsaXNoaW5nIGl0IGFzIHRoZSBsZWFkaW5nIGNvbnRyaWJ1dG9yIHRvIGdsb2JhbCBlbmVyZ3kgYW5kIGluZHVzdHJpYWwgcHJvZHVjdGlvbi4KCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeShwbG90bHkpCgogIGVjb25vbWlzdF9jb2xvcnMgPC0gYygKICAiVGhlcm1hbCBDb2FsIiA9ICIjRTMxMjBCIiwgICMgUmVkCiAgIkFudGhyYWNpdGUgQ29hbCIgPSAiIzZBMUI5QSIsCiAgIkxpZ25pdGUgQ29hbCIgPSAiI0ZGRUIzQiIsCiAgIkJpdHVtaW5vdXMgQ29hbCIgPSAiI0ZGNTcyMiIsCiAgIk1ldGFsbHVyZ2ljYWwgQ29hbCIgPSAiI0Y0QTZBMCIsCiAgIlN1Yi1CaXR1bWlub3VzIENvYWwiID0gIiM4QjQ1MTMiLAogICJPaWwgJiBOR0wiID0gIiMwMDU2QTMiLCAgICMgQmx1ZQogICJOYXR1cmFsIEdhcyIgPSAiIzAwOEY0NyIsICAgIyBHcmVlbgogICJDZW1lbnQiID0gIiNBNUE1QTUiICAjIEdyZXkKICApCgpwcm9kX3llYXJfc291cmNlJGNvbW1vZGl0eSA8LSBmYWN0b3IocHJvZF95ZWFyX3NvdXJjZSRjb21tb2RpdHksIGxldmVscyA9IG5hbWVzKGVjb25vbWlzdF9jb2xvcnMpKQoKIyBQbG90IHVzaW5nIHBsb3RseQpwbG90X2x5KHByb2RfeWVhcl9zb3VyY2UsIHggPSB+eWVhciwgeSA9IH5zdW1fcHJvZF92YWwsIGNvbG9yID0gfmNvbW1vZGl0eSwgCiAgICAgICAgY29sb3JzID0gZWNvbm9taXN0X2NvbG9ycywgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycpICU+JQogIGxheW91dCgKICAgIHRpdGxlID0gIlByb2R1Y3Rpb24gdmFsdWUgcGVyIHllYXIgcGVyIHJlc291cmNlIHR5cGUiLAogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlllYXIiKSwKICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJQcm9kdWN0aW9uIFZhbHVlIiksCiAgICBsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInJlc291cmNlIHR5cGUiKSkKICApCmBgYApEdXJpbmcgdGhpcyB0aW1lZnJhbWUsIGxpc3RlZCBjb21tb2RpdGllcywgcGFydGljdWxhcmx5IG9pbCwgbmF0dXJhbCBnYXMsIGFuZCBjb2FsLCBleHBlcmllbmNlZCBzdWJzdGFudGlhbCBncm93dGggaW4gcHJvZHVjdGlvbiB2YWx1ZSwgcGFyYWxsZWxpbmcgdGhlIGVjb25vbWljIGV4cGFuc2lvbiwgaW5kdXN0cmlhbGlzYXRpb24sIGFuZCB1cmJhbmlzYXRpb24gdGhhdCBmb2xsb3dlZCBXb3JsZCBXYXIgSUkuIFRoZSBwcmVlbWluZW5jZSBvZiBvaWwgZnJvbSB0aGUgbWlkLTIwdGggY2VudHVyeSBvbndhcmQgdW5kZXJzY29yZXMgaXRzIGNyaXRpY2FsIGltcG9ydGFuY2UgaW4gZW5lcmd5IGdlbmVyYXRpb24sIHRyYW5zcG9ydGF0aW9uLCBhbmQgaW5kdXN0cmlhbCBhcHBsaWNhdGlvbnMuIE5vdGFibHksIEJpdHVtaW5vdXMgQ29hbCAoYnJvd24gbGluZSkgYW5kIFRoZXJtYWwgQ29hbCAoZ3JheSBsaW5lKSBkZW1vbnN0cmF0ZWQgc2lnbmlmaWNhbnQgZ3Jvd3RoIHRocm91Z2hvdXQgdGhlIGluZHVzdHJpYWxpc2F0aW9uIGVyYSAoMTkwMOKAkzE5NTApLCByZWFjaGluZyBwZWFrcyBpbiB0aGUgbWlkIHRvIGxhdGUgMjB0aCBjZW50dXJ5LCB3aGljaCBjb3JyZXNwb25kcyB3aXRoIHRoZSBleHRlbnNpdmUgdXRpbGlzYXRpb24gb2YgY29hbCBmb3IgZWxlY3RyaWNpdHkgZ2VuZXJhdGlvbiBhbmQgaGVhdnkgaW5kdXN0cnkuCgoKIyMgUHJvZHVjdGlvbiB2YWx1ZXMgZnJvbSAxOTQwIHRvIDIwMjIKClRoaXMgcmV2aXNlZCBncmFwaCBlbXBoYXNpc2VzIHRoZSBwcm9kdWN0aW9uIHZhbHVlcyBvZiB2YXJpb3VzIGNvbW1vZGl0aWVzIGZyb20gMTk0MCBvbndhcmQuIFRoZSBwcm9kdWN0aW9uIHZhbHVlIG9mIE9pbCAmIE5HTCAoeWVsbG93IGxpbmUpIHNob3dzIGEgcmVtYXJrYWJsZSBzdXJnZSBwb3N0LTE5NDAsIHN1cnBhc3NpbmcgYWxsIG90aGVyIGNvbW1vZGl0aWVzIGJ5IHRoZSBsYXRlIDIwdGggY2VudHVyeSwgaW5kaWNhdGl2ZSBvZiB0aGUgaW5jcmVhc2luZyBnbG9iYWwgcmVsaWFuY2Ugb24gb2lsIGZvciB0cmFuc3BvcnRhdGlvbiwgaW5kdXN0cmlhbCBhY3Rpdml0aWVzLCBhbmQgZW5lcmd5IGdlbmVyYXRpb24uIFRoaXMgdHJlbmQgb2YgaGlnaCBwcm9kdWN0aW9uIHZhbHVlIHBlcnNpc3RzIGludG8gdGhlIDIxc3QgY2VudHVyeS4gRm9sbG93aW5nIDE5NDAsIHRoZSBnbG9iYWwgZW5lcmd5IGxhbmRzY2FwZSB1bmRlcndlbnQgYSBncmFkdWFsIHRyYW5zaXRpb24gZnJvbSBjb2FsIHRvIG9pbCBhbmQgZ2FzLCBwcm9wZWxsZWQgYnkgdGVjaG5vbG9naWNhbCBpbm5vdmF0aW9ucywgZWNvbm9taWMgZGV2ZWxvcG1lbnQsIGFuZCBhIHJpc2luZyBkZW1hbmQgZm9yIGxpcXVpZCBmdWVscyBhbmQgY2xlYW5lciBlbmVyZ3kgYWx0ZXJuYXRpdmVzLgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoZHBseXIpCgogIGVjb25vbWlzdF9jb2xvcnMgPC0gYygKICAiVGhlcm1hbCBDb2FsIiA9ICIjRTMxMjBCIiwgICMgUmVkCiAgIkFudGhyYWNpdGUgQ29hbCIgPSAiIzZBMUI5QSIsCiAgIkxpZ25pdGUgQ29hbCIgPSAiI0ZGRUIzQiIsCiAgIkJpdHVtaW5vdXMgQ29hbCIgPSAiI0ZGNTcyMiIsCiAgIk1ldGFsbHVyZ2ljYWwgQ29hbCIgPSAiI0Y0QTZBMCIsCiAgIlN1Yi1CaXR1bWlub3VzIENvYWwiID0gIiM4QjQ1MTMiLAogICJPaWwgJiBOR0wiID0gIiMwMDU2QTMiLCAgICMgQmx1ZQogICJOYXR1cmFsIEdhcyIgPSAiIzAwOEY0NyIsICAgIyBHcmVlbgogICJDZW1lbnQiID0gIiNBNUE1QTUiICAjIEdyZXkKICApCgpwcm9kX3llYXJfMTk0MCRjb21tb2RpdHkgPC0gZmFjdG9yKHByb2RfeWVhcl8xOTQwJGNvbW1vZGl0eSwgbGV2ZWxzID0gbmFtZXMoZWNvbm9taXN0X2NvbG9ycykpCgojUGxvdCAxOTQwIG9ud2FyZHMgZm9yIHNob3djYXNpbmcgaW5jcmVhc2UgYWZ0ZXIgSW5kdXN0cmlhbGlzYXRpb24KcGxvdF9seShwcm9kX3llYXJfMTk0MCwgeCA9IH55ZWFyLCB5ID0gfnN1bV9wcm9kX3ZhbCwgY29sb3IgPSB+Y29tbW9kaXR5LCBjb2xvcnMgPSBlY29ub21pc3RfY29sb3JzLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJykgJT4lCiAgbGF5b3V0KAogICAgdGl0bGUgPSAiUHJvZHVjdGlvbiBwZXIgeWVhciBwZXIgcmVzb3VyY2UgdHlwZSBmcm9tIDE5NDAiLAogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlllYXIiKSwKICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJwcm9kdWN0aW9uIHZhbHVlIiksCiAgICBsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInJlc291cmNlIHR5cGUiKSkKICApCmBgYAojIyBQcm9kdWN0aW9uIFZhbHVlcyB3aXRob3V0IE9pbCwgTkdMIGFuZCBHYXMKClRoaXMgZ3JhcGggaWxsdXN0cmF0ZXMgdGhlIGFubnVhbCBwcm9kdWN0aW9uIHZhbHVlIG9mIHZhcmlvdXMgY29tbW9kaXRpZXMsIGV4Y2x1ZGluZyBPaWwsIE5HTCwgYW5kIEdhcywgdGhlcmVieSBvZmZlcmluZyBhIG1vcmUgZm9jdXNlZCBwZXJzcGVjdGl2ZSBvbiByZXNvdXJjZXMgc3VjaCBhcyBjb2FsIGluIGl0cyB2YXJpb3VzIGZvcm1zLCBjZW1lbnQsIGFuZCBtZXRhbGx1cmdpY2FsIHByb2R1Y3RzLgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoZHBseXIpCgogIGVjb25vbWlzdF9jb2xvcnMgPC0gYygKICAiVGhlcm1hbCBDb2FsIiA9ICIjRTMxMjBCIiwgICMgUmVkCiAgIkFudGhyYWNpdGUgQ29hbCIgPSAiIzZBMUI5QSIsCiAgIkxpZ25pdGUgQ29hbCIgPSAiI0ZGRUIzQiIsCiAgIkJpdHVtaW5vdXMgQ29hbCIgPSAiI0ZGNTcyMiIsCiAgIk1ldGFsbHVyZ2ljYWwgQ29hbCIgPSAiI0Y0QTZBMCIsCiAgIlN1Yi1CaXR1bWlub3VzIENvYWwiID0gIiM4QjQ1MTMiLAogICJPaWwgJiBOR0wiID0gIiMwMDU2QTMiLCAgICMgQmx1ZQogICJOYXR1cmFsIEdhcyIgPSAiIzAwOEY0NyIsICAgIyBHcmVlbgogICJDZW1lbnQiID0gIiNBNUE1QTUiICAjIEdyZXkKICApCgpwcm9kX3llYXJfMTk0MCRjb21tb2RpdHkgPC0gZmFjdG9yKHByb2RfeWVhcl8xOTQwJGNvbW1vZGl0eSwgbGV2ZWxzID0gbmFtZXMoZWNvbm9taXN0X2NvbG9ycykpCiNQbG90IGFsbCBjb21tb2RpdGllcyBleGNsdWRpbmcgR2FzIGFuZCBPaWwgZHVlIHR1IG92ZXJ3aGVsbWluZyBzdXBlcmlvcml0eQpwbG90X2x5KHByb2RfeWVhcl9leGMsIHggPSB+eWVhciwgeSA9IH5zdW1fcHJvZF92YWwsIGNvbG9yID0gfmNvbW1vZGl0eSwgY29sb3JzID0gZWNvbm9taXN0X2NvbG9ycywgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycpICU+JQogIGxheW91dCgKICAgIHRpdGxlID0gIlByb2R1Y3Rpb24gdmFsdWUgcGVyIHllYXIgcGVyIHJlc291cmNlIHR5cGUgZXhjbHVkaW5nIE9pbCwgTkdMIGFuZCBHYXMiLAogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlllYXIiKSwKICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJwcm9kdWN0aW9uIHZhbHVlIiksCiAgICBsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInJlc291cmNlIHR5cGUiKSkKICApCmBgYApBIGNvbXByZWhlbnNpdmUgYW5hbHlzaXMgb2YgdGhlIG9ic2VydmVkIHRyZW5kcyBzaG93czoKCjEuIOKBoCDigaBBbW9uZyB0aGUgZXhjbHVkZWQgY29tbW9kaXRpZXMsIEJpdHVtaW5vdXMgY29hbCBzdGFuZHMgb3V0IGFzIHRoZSBsZWFkaW5nIHByb2R1Y3QsIGV4cGVyaWVuY2luZyBhIHNpZ25pZmljYW50IGluY3JlYXNlIGluIHByb2R1Y3Rpb24gYmVnaW5uaW5nIGluIHRoZSAxOTYwcywgcmVhY2hpbmcgaXRzIHBlYWsgYXJvdW5kIDIwMTAsIGZvbGxvd2VkIGJ5IGEgc2xpZ2h0IGRlY2xpbmUuIFRoaXMgdHJlbmQgdW5kZXJzY29yZXMgaXRzIG9uZ29pbmcgcmVsZXZhbmNlIGluIGVuZXJneSBnZW5lcmF0aW9uIGFuZCBpbmR1c3RyaWFsIGFwcGxpY2F0aW9ucywgcGFydGljdWxhcmx5IGluIGRldmVsb3BpbmcgbmF0aW9ucyB0aGF0IGRlcGVuZCBvbiBjb2FsLWZpcmVkIHBvd2VyIGZhY2lsaXRpZXMuCgoyLiAg4oGgVGhlIHByb2R1Y3Rpb24gdmFsdWUgb2YgY2VtZW50IGhhcyBzZWVuIHN1YnN0YW50aWFsIGdyb3d0aCBzaW5jZSB0aGUgMTk4MHMsIHdpdGggYSBub3RhYmxlIGFjY2VsZXJhdGlvbiBpbiB0aGUgMjAwMHMuIFRoaXMgc3VyZ2UgaXMgYSBtYXJrIG9mIGEgZ2xvYmFsIGluZnJhc3RydWN0dXJlIGFuZCBjb25zdHJ1Y3Rpb24gYm9vbSwgYXMgd2VsbCBhcyByYXBpZCB1cmJhbmlzYXRpb24gYW5kIGluZHVzdHJpYWxpc2F0aW9uIGluIGRldmVsb3BpbmcgY29udHJpZXMuCgozLiAg4oGgVGhlcm1hbCBjb2FsIGRpc3BsYXlzIGEgZ3JhZHVhbCBpbmNyZWFzZSBzaW11bGFyIHRvIHRoYXQgb2YgQml0dW1pbm91cyBjb2FsLCBhbHRob3VnaCBpdCBtYWludGFpbnMgYSBsb3dlciBvdmVyYWxsIHByb2R1Y3Rpb24gdmFsdWUsIHJlZmxlY3RpbmcgaXRzIHNwZWNpZmljIGFwcGxpY2F0aW9ucyB3aXRoaW4gY2VydGFpbiBlbmVyZ3kgc2VjdG9ycy4KCjQuICDigaBUaGUgcHJvZHVjdGlvbiBvZiBtZXRhbGx1cmdpY2FsIGNvYWwgaGFzIHNob3duIGNvbnNpc3RlbnQgZ3Jvd3RoLCBjbG9zZWx5IGxpbmtlZCB0byBhZHZhbmNlbWVudHMgaW4gaW5mcmFzdHJ1Y3R1cmUgYW5kIGluZHVzdHJpYWwgZGV2ZWxvcG1lbnQuCgo1LiAg4oGgSW4gY29udHJhc3QsIExpZ25pdGUgY29hbCBoYXMgZXhwZXJpZW5jZWQgbGltaXRlZCBncm93dGggcmVsYXRpdmUgdG8gb3RoZXIgY29hbCB0eXBlcywgd2hpY2ggY2FuIGJlIGF0dHJpYnV0ZWQgdG8gaXRzIHNwZWNpYWxpc2VkIGFwcGxpY2F0aW9ucy4KCjYuICDigaBCb3RoIEFudGhyYWNpdGUgQ29hbCBhbmQgU3ViLUJpdHVtaW5vdXMgQ29hbCByZXZlYWwgcmVsYXRpdmVseSBzdGFibGUgdHJlbmRzLCBzdWdnZXN0aW5nIGxvd2VyIHByb2R1Y3Rpb24gdmFsdWVzIGFuZCBtaW5pbWFsIGdyb3d0aCB3aGVuIGNvbXBhcmVkIHRvIG90aGVyIGNvbW1vZGl0aWVzLgoKVGhlc2Ugb2JzZXJ2YXRpb25zIGluZGljYXRlIHRoYXQsIGRlc3BpdGUgYSBnbG9iYWwgbW92ZW1lbnQgdG93YXJkcyBjbGVhbmVyIGVuZXJneSBzb3VyY2VzLCBjb2FsLCBwYXJ0aWN1bGFybHkgQml0dW1pbm91cyBhbmQgVGhlcm1hbCBDb2FsLCBjb250aW51ZXMgdG8gcGxheSBhIGNydWNpYWwgcm9sZSBpbiBudW1lcm91cyBlY29ub21pZXMuIEFkZGl0aW9uYWxseSwgdGhlIGdyb3d0aCBpbiBjZW1lbnQgcHJvZHVjdGlvbiByZWZsZWN0cyBhbiBvbmdvaW5nIGRlbWFuZCBmb3IgY29uc3RydWN0aW9uIG1hdGVyaWFscywgZHJpdmVuIGJ5IHVyYmFuaXNhdGlvbiwgaW5kdXN0cmlhbGlzYXRpb24gYW5kIGluZnJhc3RydWN0dXJlIGluaXRpYXRpdmVzLiBIb3dldmVyLCB0aGUgcmVsYXRpdmVseSBzdGFibGUgdHJlbmRzIGZvciBjZXJ0YWluIGNvYWwgdHlwZXMgYW5kIG1ldGFsbHVyZ2ljYWwgcHJvZHVjdHMgaW1wbHkgYSBwb3RlbnRpYWwgc2hpZnQgaW4gcmVzb3VyY2UgcHJpb3JpdGllcyBvdmVyIHRpbWUsIHdpdGggYSBmb2N1cyBvbiBtYXRlcmlhbHMgdGhhdCBhcmUgaW4gaGlnaGVyIGRlbWFuZCBhbmQgb2ZmZXIgZ3JlYXRlciB2ZXJzYXRpbGl0eS4KCiMjIFByb2R1Y3Rpb24gdmFsdWVzIGluY2x1ZGluZyB0b3RhbCBwcm9kdWN0aW9uCgpUb3RhbCBQcm9kdWN0aW9uIFZhbHVlOiBTaW5jZSB0aGUgbWlkLTIwdGggY2VudHVyeSwgdGhlcmUgaGFzIGJlZW4gYSBzaWduaWZpY2FudCBpbmNyZWFzZSBpbiB0b3RhbCBwcm9kdWN0aW9uIHZhbHVlLCB0aGF0IHNlcnZlcyBhcyBhbiBpbmRpY2F0aW9uIG9mIHRoZSBvdmVyYWxsIGdyb3d0aCBvZiB2YXJpb3VzIHJlc291cmNlcy4gVGhpcyBpbmNyZWFzZSBpcyBwcmltYXJpbHkgYXR0cmlidXRlZCB0byBPaWwgJiBOR0wgYW5kIE5hdHVyYWwgR2FzLCB3aGljaCBhcmUgdGhlIHByZWRvbWluYW50IGNvbnRyaWJ1dG9ycyB0byB0aGUgdG90YWwuIEl0IGlzIGVzc2VudGlhbCB0byBub3RlLCB0aGF0IHRoZSBjb21iaW5lZCB1bml0cyB2YXJpZWQsIG1lYW5pbmcgdGhhdCB0aGUgZmlndXJlIGRvZXMgbm90IHJlZmxlY3QgYW4gZXhhY3QgdmFsdWUgYnV0IHJhdGhlciBpbGx1c3RyYXRlcyB0aGUgZ2VuZXJhbCB0cmVuZCBvdmVyIHRoZSB5ZWFycy4KYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoZHBseXIpCgogIGVjb25vbWlzdF9jb2xvcnMgPC0gYygKICAiVGhlcm1hbCBDb2FsIiA9ICIjRTMxMjBCIiwgICMgUmVkCiAgIkFudGhyYWNpdGUgQ29hbCIgPSAiIzZBMUI5QSIsCiAgIkxpZ25pdGUgQ29hbCIgPSAiI0ZGRUIzQiIsCiAgIkJpdHVtaW5vdXMgQ29hbCIgPSAiI0ZGNTcyMiIsCiAgIk1ldGFsbHVyZ2ljYWwgQ29hbCIgPSAiI0Y0QTZBMCIsCiAgIlN1Yi1CaXR1bWlub3VzIENvYWwiID0gIiM4QjQ1MTMiLAogICJPaWwgJiBOR0wiID0gIiMwMDU2QTMiLCAgICMgQmx1ZQogICJOYXR1cmFsIEdhcyIgPSAiIzAwOEY0NyIsICAgIyBHcmVlbgogICJDZW1lbnQiID0gIiNGNUY1REMiLCAgIyBHcmV5CiAgInRvdGFsIiA9ICIjQTVBNUE1IgogICkKCnByb2RfeWVhcl8xOTQwJGNvbW1vZGl0eSA8LSBmYWN0b3IocHJvZF95ZWFyXzE5NDAkY29tbW9kaXR5LCBsZXZlbHMgPSBuYW1lcyhlY29ub21pc3RfY29sb3JzKSkKCgojUGxvdCBhbGwgY29tbW9kaXRpZXMgaW5jbHVkaW5nIHRvdGFsIHByb2R1Y3Rpb24KcGxvdF9seSh0b3RhbF9wcm9kX2pvaW5lZCwgeCA9IH55ZWFyLCB5ID0gfnN1bV9wcm9kX3ZhbCwgY29sb3IgPSB+Y29tbW9kaXR5LCBjb2xvcnMgPSBlY29ub21pc3RfY29sb3JzLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJykgJT4lCiAgbGF5b3V0KAogICAgdGl0bGUgPSAiUHJvZHVjdGlvbiB2YWx1ZSBwZXIgeWVhciBwZXIgcmVzb3VyY2UgdHlwZSBpbmNsdWRpbmcgdG90YWwiLAogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlllYXIiKSwKICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJwcm9kdWN0aW9uIHZhbHVlIiksCiAgICBsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInJlc291cmNlIHR5cGUiKSkKICApCgpgYGAKIyBDb21wYXJpc29uIG9mIHByb2R1Y3Rpb24gYmV0d2VlbiBlYXJseSAyMHRoIGFuZCAyMXN0IGNlbnR1cnkKClRoZXNlIGNoYXJ0cyBpbGx1c3RyYXRlIHRoZSBzdW1tYXJpemVkIHByb2R1Y2VkIGNvbW1vZGl0aWVzIGluIDE5MDAgLSAxOTIyIGFnYWluc3QgMjAwMCAtIDIwMjIuIFRoZXkgc2hvd2Nhc2UgdGhlIHByb2dyZXNzIGluIHByb2R1Y3Rpb24gdGhhdCBoYXMgYmVlbiBhY2hpZXZlZCBpbiB0aGUgbGFzdCBjZW50dXJ5IG1hZ25pZnlpbmcgdGhlIGVub3Jtb3VzIGNoYW5nZSB0aGF0IGhhcyBoYXBwZW5lZC4gRXNwZWNpYWxseSB3aGVuIHRha2luZyBhIGNsb3NlciBsb29rIGF0IHRoZSBwZXJjZW50YWdlIGNoYW5nZSBiZXR3ZWVuIHRoZSBwcm9kdWN0aW9uIGluIHRoZSAyMHRoIGNlbnR1cnkgY29tcGFyZWQgdG8gdGhlIDIxc3QgY2VudHVyeSwgYSBjbGVhciBzaGlmdCBhd2F5IGZyb20gY29hbCBhbmQgdG93YXJkcyBPaWwgYW5kIE5HTCBjYW4gYmUgb2JzZXJ2ZWQuCgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShwbG90bHkpIAogICAgICAgIAojMS4gQWdncmVnYXRlIHRoZSBkYXRhCnN1bV9kYXRhXzE5MjJfMSA8LSBzdW1fZGF0YV8xOTIyICU+JQogIGdyb3VwX2J5KGNvbW1vZGl0eSkgJT4lCiAgc3VtbWFyaXNlKHRvdGFsX3Byb2R1Y3Rpb24gPSBzdW0oc3VtX3Byb2RfdmFsLCBuYS5ybSA9IFRSVUUpKSAlPiUKICBhcnJhbmdlKGRlc2ModG90YWxfcHJvZHVjdGlvbikpCgojIDIuIFNlbGVjdCB0aGUgdG9wIDggY29tbW9kaXRpZXMKdG9wX2NvbW1vZGl0aWVzIDwtIHN1bV9kYXRhXzE5MjJfMSAlPiUgCiAgc2xpY2VfaGVhZChuID0gOCkKCiMgQ2FsY3VsYXRlIHBlcmNlbnRhZ2VzCnRvcF9jb21tb2RpdGllcyA8LSB0b3BfY29tbW9kaXRpZXMgJT4lCiAgbXV0YXRlKHBlcmNlbnQgPSB0b3RhbF9wcm9kdWN0aW9uIC8gc3VtKHRvdGFsX3Byb2R1Y3Rpb24pICogMTAwKQoKIyAzLiBDcmVhdGUgdGhlIGludGVyYWN0aXZlIHBpZSBjaGFydApwaWVfY2hhcnQgPC0gcGxvdF9seSgKICBkYXRhID0gdG9wX2NvbW1vZGl0aWVzLAogIGxhYmVscyA9IH5jb21tb2RpdHksCiAgdmFsdWVzID0gfnRvdGFsX3Byb2R1Y3Rpb24sCiAgdHlwZSA9ICdwaWUnLAogIHRleHRpbmZvID0gJ2xhYmVsK3BlcmNlbnQnLCAgICAgICAjIERpc3BsYXkgYm90aCBsYWJlbCBhbmQgcGVyY2VudCBvbiB0aGUgcGllCiAgaW5zaWRldGV4dG9yaWVudGF0aW9uID0gJ2hvcml6b250YWwnLCAjIE1ha2UgdGV4dCBpbnNpZGUgaG9yaXpvbnRhbAogIGhvdmVyaW5mbyA9ICdsYWJlbCtwZXJjZW50K3ZhbHVlJywgIyBUb29sdGlwIHNob3dzIGxhYmVsLCBwZXJjZW50LCBhbmQgdmFsdWUKICBtYXJrZXIgPSBsaXN0KGNvbG9ycyA9IGNvbG9yUmFtcFBhbGV0dGUoYygKICAiIzAwNTZBMyIsICAgICAgIyBOYXR1cmFsIEdhcwogICIjRkY1NzIyIiwgICAgICAgIyBPaWwgJiBOR0wKICAiIzAwOEY0NyIsICAgICAjIEJpdHVtaW5vdXMgY29hbAogICIjRkYwMDAwIiwgICAgICAgIyBDZW1lbnQKICAibGlnaHRibHVlIiwgICMgTWV0YWxsdXJnaWNhbCBDb2FsCiAgIiNGRkVCM0IiLCAjIFN1YiAtIEJpdHVtaW5vdXMgY29hbAogICJncmV5IiwgICAgICAgICMgTGlnbml0ZSBDb2FsCiAgInB1cnBsZSIsICAgICAjIFRoZXJtYWwgQ29hbAogICJwaW5rIiAgICAgICAgIyBBbnRocmFjaXRlIENvYWwKKSkoOCkpICMgQ3VzdG9tIGNvbG9ycwopICU+JQogIGxheW91dCgKICAgIHRpdGxlID0gIlRvcCA4IENvbW1vZGl0aWVzIGJ5IFRvdGFsIFByb2R1Y3Rpb24iLAogICAgc2hvd2xlZ2VuZCA9IFRSVUUsCiAgICBsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInJlc291cmNlIHR5cGUiKSksCiAgICBtYXJnaW4gPSBsaXN0KGwgPSA1MCwgciA9IDUwLCB0ID0gNTAsIGIgPSA1MCkgIyBBZGQgcGFkZGluZyBmb3IgbGFiZWxzCiAgKQoKIyBEaXNwbGF5IHRoZSBwaWUgY2hhcnQKcGllX2NoYXJ0CmBgYAoKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHBsb3RseSkgCiAgICAgICAgCiMxLiBBZ2dyZWdhdGUgdGhlIGRhdGEKc3VtX2RhdGFfMjAyMl8xIDwtIHN1bV9kYXRhXzIwMjIgJT4lCiAgZ3JvdXBfYnkoY29tbW9kaXR5KSAlPiUKICBzdW1tYXJpc2UodG90YWxfcHJvZHVjdGlvbiA9IHN1bShzdW1fcHJvZF92YWwsIG5hLnJtID0gVFJVRSkpICU+JQogIGFycmFuZ2UoZGVzYyh0b3RhbF9wcm9kdWN0aW9uKSkKCiMgMi4gU2VsZWN0IHRoZSB0b3AgOCBjb21tb2RpdGllcwp0b3BfY29tbW9kaXRpZXMgPC0gc3VtX2RhdGFfMjAyMl8xICU+JSAKICBzbGljZV9oZWFkKG4gPSA5KQoKIyBDYWxjdWxhdGUgcGVyY2VudGFnZXMKdG9wX2NvbW1vZGl0aWVzIDwtIHRvcF9jb21tb2RpdGllcyAlPiUKICBtdXRhdGUocGVyY2VudCA9IHRvdGFsX3Byb2R1Y3Rpb24gLyBzdW0odG90YWxfcHJvZHVjdGlvbikgKiAxMDApCgojIDMuIENyZWF0ZSB0aGUgaW50ZXJhY3RpdmUgcGllIGNoYXJ0CnBpZV9jaGFydDIgPC0gcGxvdF9seSgKICBkYXRhID0gdG9wX2NvbW1vZGl0aWVzLAogIGxhYmVscyA9IH5jb21tb2RpdHksCiAgdmFsdWVzID0gfnRvdGFsX3Byb2R1Y3Rpb24sCiAgdHlwZSA9ICdwaWUnLAogIHRleHRpbmZvID0gJ2xhYmVsK3BlcmNlbnQnLCAgICAgICAjIERpc3BsYXkgYm90aCBsYWJlbCBhbmQgcGVyY2VudCBvbiB0aGUgcGllCiAgaW5zaWRldGV4dG9yaWVudGF0aW9uID0gJ2hvcml6b250YWwnLCAjIE1ha2UgdGV4dCBpbnNpZGUgaG9yaXpvbnRhbAogIGhvdmVyaW5mbyA9ICdsYWJlbCtwZXJjZW50K3ZhbHVlJywgIyBUb29sdGlwIHNob3dzIGxhYmVsLCBwZXJjZW50LCBhbmQgdmFsdWUKICBtYXJrZXIgPSBsaXN0KGNvbG9ycyA9IGNvbG9yUmFtcFBhbGV0dGUoYygKICAiIzAwOEY0NyIsICAgICAgIyBOYXR1cmFsIEdhcwogICIjMDA1NkEzIiwgICAgICAgIyBPaWwgJiBOR0wKICAiI0ZGNTcyMiIsICAgICAjIEJpdHVtaW5vdXMgY29hbAogICIjODFDNzg0IiwgICAgICAgIyBDZW1lbnQKICAiI0ZGRUIzQiIsICAjIE1ldGFsbHVyZ2ljYWwgQ29hbAogICJsaWdodGJsdWUiLCAjIFN1YiAtIEJpdHVtaW5vdXMgY29hbAogICJncmV5IiwgICAgICAgICMgTGlnbml0ZSBDb2FsCiAgIiNGRjAwMDAiLCAgICAgIyBUaGVybWFsIENvYWwKICAicGluayIsICAgICAgICAjIEFudGhyYWNpdGUgQ29hbAogICJwdXJwbGUiCikpKDkpKSAjIEN1c3RvbSBjb2xvcnMKKSAlPiUKICBsYXlvdXQoCiAgICB0aXRsZSA9ICJUb3AgOSBDb21tb2RpdGllcyBieSBUb3RhbCBQcm9kdWN0aW9uIiwKICAgIHNob3dsZWdlbmQgPSBUUlVFLAogICAgbGVnZW5kID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJyZXNvdXJjZSB0eXBlIikpLAogICAgbWFyZ2luID0gbGlzdChsID0gNTAsIHIgPSA1MCwgdCA9IDUwLCBiID0gNTApICMgQWRkIHBhZGRpbmcgZm9yIGxhYmVscwogICkKCiMgRGlzcGxheSB0aGUgcGllIGNoYXJ0CnBpZV9jaGFydDIKYGBgCkhvd2V2ZXIsIHRoZSBzaG93Y2FzZWQgcGVyY2VudGFnZSBwb2ludHMgYW5kIHRodXMgdGhlIGluZGljYXRlZCBsb3dlciBwcm9kdWN0aW9uIG9mIGFsbCBjb21tb2RpdGllcyByZXZvbHZpbmcgYXJyb3VuZCBjb2FsIGFyZSBtaXNsZWFkaW5nIGR1ZSB0byB0aGUgZXhwb25lbnRpYWwgaW5jcmVhc2UgaW4gdG90YWwgcHJvZHVjdGlvbiB0aGF0IG9jY3VycmVkIG92ZXIgdGhlIGxhc3QgY2VudHVyeS4gQXMgYSBtYXR0ZXIgb2YgZmFjdCwgdGhlIGNvYWwgcHJvZHVjdGlvbiBkaWQgaW5jcmVhc2UgZnJvbSB0aGUgMjB0aCB0b3dhcmRzIHRoZSAyMXN0IGNlbnR1cnkuIEhvd2V2ZXIgaXQganVzdCBkaWQgbm90IGluY3JlYXNlIGluIGV4cG9uZW50aWFsIGZhc2hpb24gYnV0IG1vcmUgbGluZWFyLiBUaHVzLCBhIG1vcmUgZGV0YWlsZWQgYW5hbHlzaXMgc2hvd3M6CgoxLiBUaGUgcGVyY2VudGFnZSBvZiBPaWwgYW5kIE5HTCBwcm9kdWN0aW9uIGlzIGxvd2VyIGluIDIxc3QgY2VudHVyeSBjb21wYXJlZCB0byB0aGUgMjB0aCBjZW50dXJ5LiBUaGlzIGJ5IG5vIG1lYW5zIHNheXMsIHRoYXQgdGhlIHRvdGFsIHByb2R1Y3Rpb24gaXMgcmVkdWNlZCwgYnV0IGl0IHNob3djYXNlcyBqdXN0IGhvdyBtdWNoIG5hdHVyYWwgR2FzIGlzIHByb2R1Y2VkIHRvIHRoaXMgZGF5LiAKCjIuIE9pbCwgTkdMICYgR2FzIG1ha2UgdXAgODcuMiAlIG9mIGFsbCBwcm9kdWNlZCBjb21tb2RpdGllcyBpbiAyMXN0IGNlbnR1cnkgc2hvd2Nhc2luZyB0aGVpciByZWxldmFuY2UgdG9kYXksIHdoaWxlIGJhY2sgaW4gdGhlIDIwdGggY2VudHVyeSwgcHJvZHVjdGlvbiB3YXMgbW9yZSBkaXZlcnNlIHdpdGggZm91ciBtYWpvciBwbGF5ZXJzLiBBbGwgb2YgdGhvc2UgbWFqb3IgcGxheWVycyBwYXJ0aWNpcGF0aW5nIG92ZXIgMTAlIHdpdGggdHdvIG9mIHdoaWNoIGV2ZW4gcGFydGljaXBhdGluZyBvdmVyIDIwJSB0byB0aGUgdG90YWwgcHJvZHVjdGlvbi4gV2hlbiBjb21wYXJpbmcgdGhlIGNoYXJ0cyBpdCBiZWNvbWVzIGNsZWFyIHRoYXQsIE9pbCBhbmQgTkdMIHdlcmUgZG9taW5hdGluZyBhbHJlYWR5IGFuZCBjb250aW51ZWQgdGhlaXIgZG9taW5hbmNlLCB3aGlsc3QgYml0dW1pbm91cyBjb2FsIGhhcyBsb3N0IGFsbW9zdCAyMCAlLiBOYXR1cmFsIGdhcyBoYXMgY2xlYXJseSByaXNlbiBmcm9tIDEyLjUlIHRvIG1vc3QgcHJvZHVjZWQgY29tbW9kaXR5IHdpdGggYSB0b3RhbCBvZiA0NSAlLgoKMy4gVGhlIG1ham9yaXR5IG9mIGNvYWwgY2xhc3NlcyBuZXZlciBzaG93ZWQgYSBodWdlIHBlcmNlbnRhZ2Ugb2YgdG90YWwgcHJvZHVjdGlvbiBhbmQgZGlkIGFsc28gbm90IGNhdGNoIHVwLCB3aGlsc3Qgc29tZSBldmVuIGxvc3QgcmVsZXZhbmNlIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgY2VudHVyeS4KCjQuIENlbWVudCB3YXMgbm90IHByb2R1Y2VkIHVudGlsIHRoZSBtaWQgMjB0aCBjZW50dXJ5LCBob3dldmVyIGl0IGFsc28gZGlkIG5vdCBleGNlZWRlZCBhIHBhcnRpY2lwYXRpb24gdG8gdGhlIHRvdGFsIHByb2R1Y3Rpb24gb2YgMy40JSBkdXJpbmcgdGhlIHRpbWUgaXQgd2FzIHByb2R1Y2VkIG1ha2luZyBpdCBvbmx5IGEgbWlub3IgcGxheWVyLiBIb3dldmVyIGl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgaXQgc3RpbGwgaXMgb25lIG9mIHRocmVlIHJlc291cmNlIHR5cGVzIHRoYXQgaW5jcmVhc2VkIGluIHBlcmNlbnRhZ2UgdG90YWwgcHJvZHVjdGlvbi4KCkNvbmNsdWRpbmcgaXQgY2FuIGJlIHNhaWQgdGhhdCB0aGUgcHJvZHVjdGlvbiBkaWQgY2hhbmdlIGluIHRoZSBsYXN0IGNlbnR1cnksIG1haW5seSBhbGwgYW5hbHl6ZWQgY29tbW9kaXRpZXMgaW5jcmVhc2VkIHRoZWlyIHRvdGFsIHByb2R1Y3Rpb24gdm9sdW1lLCBob3dldmVyIHRoZSBwZXJjZW50YWdlIHNob3djYXNlZCBvbmUgbWFqb3Igd2lubmVyIGFuZCBvbmUgbWFqb3IgbG9vc2VyIGR1cmluZyB0aGUgbGFzdCBkZWNhZGUuIEFsbCBvdGhlciBjb21tb2RpdGllcyBkaWQgZ2FpbiBvciBsb3NlIGEgZmV3IHBlcmNlbnRhZ2UgcG9pbnRzLCBidXQgbm8gc3RyaWtpbmcgY2hhbmdlIHdhcyBub3RlZC4KCiMgQ29tcGFyaXNvbiBvZiB0b3RhbCBlbWlzc2lvbiB2ZXJzdXMgdG90YWwgcHJvZHVjdGlvbgpDb21taW5nIHRvIGFuIGVuZCBvZiB0aGUgYW5hbHlzaXMgb2YgdG90YWwgcHJvZHVjdGlvbiB3ZSB3YW50ZWQgdG8gY29tcGFyZSB0aGUgdG90YWwgcHJvZHVjdGlvbiBzdW1tYXJpemVkIHZlcnN1cyB0aGUgdG90YWwgZW1pc3Npb24uIEZpcnN0IG9mIGFsbCwgaXQgaGFzIHRvIGJlIGRlbm90ZWQgdGhhdCB0aGUgc3VtbWFyaXplZCBwcm9kdWN0aW9uIGNvbnNpc3RzIG9mIGEgc3VtbWFyeSBvZiBkaWZmZXJlbnQgdW5pdHMgYW5kIGlzIHRodXMgb25seSBhbiBlc3RpbWF0aW9uLCB3aGlsZSB0aGUgc3VtbWFyaXplZCBlbWlzc2lvbnMgY29uc2lzdCBvZiBvbmUgc2luZ2xlIHVuaXQgYW5kIGFyZSB0aHVzIHByZWNpY2UuCmBgYHtyfQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShkcGx5cikKCnBsb3RfbHkodG90YWxfZW1pc3NfcHJvZCwgeCA9IH55ZWFyLCB5ID0gfnZhbHVlICwgY29sb3IgPSB+Y2F0ZWdvcnksIGNvbG9ycyA9ICJTZXQxIiwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycpICU+JQogIGxheW91dCgKICAgIHRpdGxlID0gIlByb2R1Y3Rpb24gdmFsdWUgcGVyIHllYXIgcGVyIHJlc291cmNlIHR5cGUgaW5jbHVkaW5nIHRvdGFsIiwKICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJZZWFyIiksCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiRW1pc3Npb24gdmFsdWUiKSwKICAgIGxlZ2VuZCA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAicmVzb3VyY2UgdHlwZSIpKQogICkKYGBgCldoZW4gYW5hbHl6aW5nIHRoZSBkYXRhIGFuIGFsbW9zdCBleHBvbmVudGlhbCBpbmNyZWFzZSBvZiBwcm9kdWN0aW9uIHZhbHVlcyBjYW4gYmUgc2VlbiB3aGlsZSB0aGUgZW1pc3Npb24gdmFsdWVzIGxhZyBiZWhpbmQuIEhvd2V2ZXIsIHRoZXkgc3RpbGwgc2hvdyBhIHNpbWlsYXIgcGF0dGVybiBpbmRpY2F0aW5nIGEgY29ycmVsYXRpb24gYmV0d2VlbiBoaWdoIHByb2R1Y3Rpb24gYW5kIGhpZ2ggZW1pc3Npb24uIFdoZW4gY29tcGFyaW5nIHRoZSB0d28gY3VydmVzIG9uZSBjbGVhciBkaXN0aW5jdGlvbiBjYW4gYmUgb2JzZXJ2ZWQuCgpXaGlsZSB0aGUgcHJvZHVjdGlvbiB2YWx1ZXMgc2hvdyB2ZXJ5IHNoYXJwIGRyb3BzIGFuZCByYXBpZCByZWNvbnNvbGlkYXRpb24sIHRoZSBlbWlzc2lvbiB2YWx1ZXMgc2VlbSB0byBiZSBhIGJpdCBsZXNzIGR5bmFtaWMuIFRoZXkgZG8gbm90IHNwaWtlIGFzIGhpZ2hseSBidXQgZG8gIG5vdCBkcm9wIGFzIHNoYXJwbHkgaW5kaWNhdGluZyBhIGRlY291cGxpbmcgYmV0d2VlbiBwcm9kdWN0aW9uIGFuZCBlbWlzc2lvbi4gVGhlIGFyZ3VtZW50IGJlY29tZXMgbW9yZSBjb21wZWxsaW5nIHdoZW4gZXZhbHVhdGluZyB0aGUgbGFzdCAxMCB5ZWFycy4gV2hpbGUgcHJvZHVjdGlvbiBjb250aW51ZXMgdG8gcmlzZSwgZW1pc3Npb25zIHN0YWduYXRlLCB0aG91Z2ggYSB0cmVuZCByZXZlcnNhbCBjYW4gbm90IGJlIG9ic2VydmVkIGFzIG9mIHlldC4gCgojIEFuYWx5c2lzIG9mIEVtaXNzaW9uIERhdGEKCiMjIFRvdGFsIGVtaXNzaW9ucyBieSBvd25lcnNoaXAgYW5kIHJlc291cmNlIHR5cGUKClRoaXMgYmFyIGNoYXJ0IHByZXNlbnRzIHRoZSB0b3RhbCBlbWlzc2lvbnMgKG1lYXN1cmVkIGluIE10Q08yZSkgY2F0ZWdvcml6ZWQgYnkgdGhyZWUgdHlwZXMgb2Ygb3duZXJzaGlwOiBJbnZlc3Rvci1vd25lZCBDb21wYW5pZXMsIE5hdGlvbiBTdGF0ZXMsIGFuZCBTdGF0ZS1vd25lZCBFbnRpdGllcy4gVGhlIGVtaXNzaW9ucyBkYXRhIGlzIGZ1cnRoZXIgY2F0ZWdvcml6ZWQgYnkgcmVzb3VyY2UgdHlwZSwgd2hpY2ggaW5jbHVkZXMgQ29hbCAoaW5kaWNhdGVkIGluIHJlZCksIEdhcyAoaW5kaWNhdGVkIGluIGdyZWVuKSwgT2lsIChpbmRpY2F0ZWQgaW4gYmx1ZSksIGFuZCBPdGhlciAoaW5kaWNhdGVkIGluIGdyYXkpLiBUaGUgcHJpbWFyeSBmaW5kaW5ncyBhcmUgYXMgZm9sbG93czoKCjEuICDigaBUaGUgZW1pc3Npb25zIGZyb20gaW52ZXN0b3Itb3duZWQgY29tcGFuaWVzIGFyZSBwcmVkb21pbmFudGx5IGRlcml2ZWQgZnJvbSBPaWwgYW5kIEdhcywgd2l0aCBhIGxlc3NlciBjb250cmlidXRpb24gZnJvbSBjb2FsLgoKMi4gIOKBoEZvciBuYXRpb24tb3duZWQgY29tcGFuaWVzLCBjb2FsIGlzIHRoZSBwcmluY2lwYWwgc291cmNlIG9mIGVtaXNzaW9ucywgd2l0aCBPaWwgYW5kIEdhcyBjb250cmlidXRpbmcgdG8gYSBsZXNzZXIgZXh0ZW50LgoKMy4gIOKBoFN0YXRlLW93bmVkIGNvbXBhbmllcyBwcmltYXJpbHkgZ2VuZXJhdGUgZW1pc3Npb25zIGZyb20gT2lsLCB3aXRoIHRvdGFsIGVtaXNzaW9ucyBiZWluZyBjb25zaWRlcmFibHkgaGlnaGVyIHRoYW4gdGhvc2UgZnJvbSBwcml2YXRlbHkgb3duZWQgY29tcGFuaWVzLCB5ZXQgc3RpbGwgbG93ZXIgdGhhbiB0aG9zZSBmcm9tIG5hdGlvbi1vd25lZCBlbnRpdGllcy4KCkEgcG90ZW50aWFsIGV4cGxhbmF0aW9uIGZvciB0aGVzZSB0cmVuZHMgaXMgdGhhdCBpbnZlc3Rvci1vd25lZCBjb21wYW5pZXMgdGVuZCB0byBvcGVyYXRlIG9uIGEgc21hbGxlciBzY2FsZSB3aXRoIGEgZm9jdXMgb24gcHJvZml0YWJpbGl0eS4gSW4gY29udHJhc3QsIG5hdGlvbi1vd25lZCBjb21wYW5pZXMgbWF5IHByaW9yaXRpemUgZW5lcmd5IHNlY3VyaXR5IGFuZCBlbXBoYXNpemUgZW5lcmd5IHByb2R1Y3Rpb24gZnJvbSBkb21lc3RpYyByZXNvdXJjZXMuIEEgc2ltaWxhciByYXRpb25hbGUgbWF5IGFwcGx5IHRvIHN0YXRlLW93bmVkIGNvbXBhbmllcywgd2hpY2ggb2Z0ZW4gb3ZlcnNlZSB0aGUgbmF0aW9uYWwgb2lsIGFuZCBnYXMgc2VjdG9ycyBhbmQgc2VydmUgYXMgYSBjcnVjaWFsIHJldmVudWUgc291cmNlIGZvciBtYW55IGdvdmVybm1lbnRzLgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeShwbG90bHkpCiNvcGVuIHRoZSBkYXRhCmRhdGEgPC0gZW1pc3Npb25zCiNmaWx0ZXJpbmcgdGhlIGxhc3QgNTAgeWVhcnMKbGF0ZXN0NTBfeWVhcnMgPSBtYXgoZGF0YSR5ZWFyKQpkYXRhIDwtZGF0YSAlPiUKICBmaWx0ZXIoIHllYXIgPj0gKGxhdGVzdDUwX3llYXJzLSA1MCkpCiMgY2F0ZWdvcml6ZWQgY29tbW9kaXRpZXMKZGF0YSRyZXNvdXJjZV90eXBlIDwtIGlmZWxzZSgKICBkYXRhJGNvbW1vZGl0eSA9PSAiT2lsICYgTkdMIiwgIk9pbCIsCiAgaWZlbHNlKAogICAgZGF0YSRjb21tb2RpdHkgPT0gIk5hdHVyYWwgR2FzIiwgIkdhcyIsCiAgICBpZmVsc2UoCiAgICAgIGRhdGEkY29tbW9kaXR5ICVpbiUgYygiTWV0YWxsdXJnaWNhbCBDb2FsIiwgIkFudGhyYWNpdGUgQ29hbCIgLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCaXR1bWlub3VzIENvYWwiLCJTdWItQml0dW1pbm91cyBDb2FsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGVybWFsIENvYWwiICwiTGlnbml0ZSBDb2FsIiApLCAiQ29hbCIsCiAgICAgICJPdGhlciIKICAgICkKICApCikKI3N1bW1lcnkgZm9yIG93bmVyc2hpcCBhbmQgY29tbW9kaXR5IGludG8gZW1taXNpb25zCnN1bW1hcnlfZGF0YSA8LSBkYXRhICU+JQogIGdyb3VwX2J5KHBhcmVudF90eXBlLHJlc291cmNlX3R5cGUpICU+JQogIHN1bW1hcmlzZShlbWlzc2lvbnNfTXRDTzJlID0gc3VtKHRvdGFsX2VtaXNzaW9uc19NdENPMmUsIG5hLnJtID0gVFJVRSkpJT4lCiAgdW5ncm91cCgpCiMgQ29sb3JzCmVjb25vbWlzdF9jb2xvcnMgPC0gYygKICAiQ29hbCIgPSAiI0UzMTIwQiIsICAjIEJvbGQgcmVkCiAgIk9pbCIgPSAiIzAwNTZBMyIsICAgIyBCb2xkIGJsdWUKICAiR2FzIiA9ICIjMDA4RjQ3IiwgICAjIEJvbGQgZ3JlZW4KICAiT3RoZXIiID0gIiNBNUE1QTUiICAjIE5ldXRyYWwgZ3JheQopCgojIEJBUiBDSEFSVApzdGF0aWNfcGxvdCA8LSBnZ3Bsb3Qoc3VtbWFyeV9kYXRhLCBhZXMoCiAgeCA9IHBhcmVudF90eXBlLCAKICB5ID0gZW1pc3Npb25zX010Q08yZSwgCiAgZmlsbCA9IHJlc291cmNlX3R5cGUsIAogIHRleHQgPSBwYXN0ZTAoCiAgICAiT3duZXJzaGlwOiAiLCBwYXJlbnRfdHlwZSwgCiAgICAiPGJyPlJlc291cmNlOiAiLCByZXNvdXJjZV90eXBlLCAKICAgICI8YnI+RW1pc3Npb246ICIsIHJvdW5kKGVtaXNzaW9uc19NdENPMmUsIDIpLCAiIE10Q08yZSIKICApCikpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAic3RhY2siLCB3aWR0aCA9IDAuNykgKyAgIyBBZGp1c3QgYmFyIHdpZHRoCiAgbGFicygKICAgIHRpdGxlID0gIlRvdGFsIEVtaXNzaW9ucyBieSBPd25lcnNoaXAgYW5kIFJlc291cmNlIFR5cGUiLAogICAgc3VidGl0bGUgPSAiU3RhY2tlZCBlbWlzc2lvbnMgYWNyb3NzIGRpZmZlcmVudCBvd25lcnNoaXAgY2F0ZWdvcmllcyIsCiAgICB4ID0gIk93bmVyc2hpcCIsCiAgICB5ID0gIlRvdGFsIEVtaXNzaW9ucyBpbiBNdENPMiIsCiAgICBmaWxsID0gIlJlc291cmNlIFR5cGUiCiAgKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gZWNvbm9taXN0X2NvbG9ycykgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpICsKICB0aGVtZSgKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE2LCBjb2xvciA9ICJibGFjayIpLAogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGNvbG9yID0gImJsYWNrIiksCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBjb2xvciA9ICJibGFjayIpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSAiYmxhY2siKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGNvbG9yID0gImJsYWNrIiksCiAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gTkEpLCAgICAKICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSBOQSksICAgICAKICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5ODAiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSwgIAogICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCkKICApCgojIENvbnZlcnQgdG8gaW50ZXJhY3RpdmUgcGxvdCAKaW50ZXJhY3RpdmVfcGxvdCA8LSBnZ3Bsb3RseShzdGF0aWNfcGxvdCwgdG9vbHRpcCA9ICJ0ZXh0IikKCmludGVyYWN0aXZlX3Bsb3QKYGBgCgojIyBZZWFybHkgZW1pc3Npb25zIGJ5IHJlc291cmNlIHR5cGUgdHlwZQoKQSBuZXcgY2hhcnQgcHJlc2VudHMgYW4gYW5hbHlzaXMgb2YgYW5udWFsIGVtaXNzaW9ucyBjYXRlZ29yaXplZCBieSBjb21tb2RpdHkgdHlwZSBmcm9tIDE5MDAgdG8gMjAyNSwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIENvYWwsIEdhcywgT2lsLCBhbmQgT3RoZXIgcmVzb3VyY2VzLiBUaGlzIGdyYXBoIGVmZmVjdGl2ZWx5IGludGVncmF0ZXMgZGF0YSBmcm9tIFN0YXRlLW93bmVkIEVudGl0aWVzIGFuZCBOYXRpb24gU3RhdGVzLiBUaGUgcHJpbmNpcGFsIGZpbmRpbmdzIGFyZSBhcyBmb2xsb3dzOgoKMS4gIOKBoENvYWwgY29udGludWVzIHRvIGJlIHRoZSBwcmVkb21pbmFudCBzb3VyY2Ugb2YgZW1pc3Npb25zLCBmb2xsb3dlZCBieSBPaWwsIHdpdGggR2FzIGNvbnRyaWJ1dGluZyBsZXNzIHNpZ25pZmljYW50bHkgYW5kIE90aGVyIHJlc291cmNlcyBoYXZpbmcgbWluaW1hbCBpbXBhY3QuCgoyLiDigaAg4oGgQSBub3RhYmxlIHN1cmdlIGluIGVtaXNzaW9ucyBhY3Jvc3MgYWxsIHJlc291cmNlIGNhdGVnb3JpZXMgaXMgb2JzZXJ2ZWQgYmVnaW5uaW5nIGluIHRoZSBtaWQtMjB0aCBjZW50dXJ5LgoKMy4g4oGgIOKBoFdoaWxlIGNvYWwgZW1pc3Npb25zIGFyZSBzdWJzdGFudGlhbCwgdGhlcmUgaXMgYSBtYXJrZWQgaW5jcmVhc2UgaW4gb2lsIGVtaXNzaW9ucyBwb3N0LW1pZC0yMHRoIGNlbnR1cnksIGFuZCBnYXMgZW1pc3Npb25zIGV4aGliaXQgYSBtb3JlIGdyYWR1YWwgcmlzZS4KCgpTZXZlcmFsIGZhY3RvcnMgbWF5IGV4cGxhaW4gdGhlc2UgdHJlbmRzLiBDb2FsIHNlcnZlZCBhcyB0aGUgZm91bmRhdGlvbiBvZiB0aGUgaW5kdXN0cmlhbCByZXZvbHV0aW9uIGFuZCBtYWludGFpbmVkIGl0cyBzdGF0dXMgYXMgdGhlIHByaW1hcnkgZW5lcmd5IHNvdXJjZSBmb3IgbWFueSB5ZWFycyBkdWUgdG8gaXRzIGF2YWlsYWJpbGl0eSBhbmQgYWZmb3JkYWJpbGl0eS4gSXQgYmVjYW1lIHRoZSBsZWFkaW5nIGZ1ZWwgZm9yIHBvd2VyIGdlbmVyYXRpb24gd29ybGR3aWRlLCB3aXRoIGl0cyB1c2FnZSBwZWFraW5nIGluIHRoZSBsYXRlIDIwdGggY2VudHVyeSB0byBtYXRjaCB3aXRoIHJpc2luZyBlbGVjdHJpY2l0eSBkZW1hbmRzLiAKClRoZSBwZWFrIHBlcmlvZCBmb3Igb2lsIGVtaXNzaW9ucyBvY2N1cnJlZCBmcm9tIHRoZSBsYXRlIDIwdGggY2VudHVyeSB0byB0aGUgZWFybHkgMjFzdCBjZW50dXJ5LCBjb2luY2lkaW5nIHdpdGggdGhlIGdsb2JhbCBleHBhbnNpb24gb2YgdHJhbnNwb3J0YXRpb24gbW9kZXMgc3VjaCBhcyBhdXRvbW9iaWxlcywgYWlyY3JhZnQsIGFuZCBzaGlwcGluZyBmb2xsb3dpbmcgV29ybGQgV2FyIElJLiBBZGRpdGlvbmFsbHksIG9pbCBlbWVyZ2VkIGFzIGEgY3J1Y2lhbCBjb21wb25lbnQgaW4gdGhlIHByb2R1Y3Rpb24gb2YgcGxhc3RpY3MsIGNoZW1pY2FscywgYW5kIHN5bnRoZXRpYyBtYXRlcmlhbHMsIGZ1cnRoZXIgZXNjYWxhdGluZyBkZW1hbmQuIFRoZSAxOTcwcyBleHBlcmllbmNlZCBzaWduaWZpY2FudCBpbmNyZWFzZXMgaW4gb2lsIHByb2R1Y3Rpb24gYW5kIGVtaXNzaW9ucywgZGVzcGl0ZSBmbHVjdHVhdGlvbnMgaW4gcHJpY2VzLCBsYXJnZWx5IGR1ZSB0byB0aGUgY29udHJvbCBleGVydGVkIGJ5IHN0YXRlLW93bmVkIGVudGl0aWVzIGluIE9QRUMgbmF0aW9ucyBvdmVyIGEgc3Vic3RhbnRpYWwgcG9ydGlvbiBvZiB0aGUgZ2xvYmFsIHN1cHBseS4KCk5hdHVyYWwgZ2FzIGhhcyBnYWluZWQgdHJhY3Rpb24gYXMgYSAiY2xlYW5lciIgZm9zc2lsIGZ1ZWwgYWx0ZXJuYXRpdmUgdG8gY29hbCwgcmVzdWx0aW5nIGluIGEgc3RlYWR5IHJpc2UgaW4gZW1pc3Npb25zIGFzIG5hdGlvbnMgc2hpZnRlZCBhd2F5IGZyb20gY29hbCBkZXBlbmRlbmN5LiBOdW1lcm91cyBOYXRpb24gU3RhdGVzIGFuZCBTdGF0ZS1vd25lZCBFbnRpdGllcyBoYXZlIG1hZGUgY29uc2lkZXJhYmxlIGludmVzdG1lbnRzIGluIGdhcyBwcm9kdWN0aW9uLCByZWNvZ25pc2luZyBpdCBhcyBhIHN0cmF0ZWdpYyBlbmVyZ3kgcmVzb3VyY2UsIHBhcnRpY3VsYXJseSBpbiB0aGUgMjFzdCBjZW50dXJ5LiBUaGlzIHVwd2FyZCB0cmVuZCBpbiBnYXMgZW1pc3Npb25zIGlzIG9uZ29pbmcsIHJlZmxlY3RpbmcgY29uc2lzdGVudCBncm93dGggc2luY2UgdGhlIGxhdGUgMjB0aCBjZW50dXJ5LgoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocGxvdGx5KQojb3BlbiB0aGUgZGF0YQojZmlsZV9wYXRoIDwtICJ+L0Rlc2t0b3AvUnByb2plY3QvRW1pc3Npb25zX20uY3N2IiAgCmRhdGFfYXJlYSA8LSBlbWlzc2lvbnMKIyBjYXRlZ29yaXplZCBjb21tb2RpdGllcwpkYXRhX2FyZWEkcmVzb3VyY2VfdHlwZSA8LSBpZmVsc2UoCiAgZGF0YV9hcmVhJGNvbW1vZGl0eSA9PSAiT2lsICYgTkdMIiwgIk9pbCIsCiAgaWZlbHNlKAogICAgZGF0YV9hcmVhJGNvbW1vZGl0eSA9PSAiTmF0dXJhbCBHYXMiLCAiR2FzIiwKICAgIGlmZWxzZSgKICAgICAgZGF0YV9hcmVhJGNvbW1vZGl0eSAlaW4lIGMoIk1ldGFsbHVyZ2ljYWwgQ29hbCIsICJBbnRocmFjaXRlIENvYWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJpdHVtaW5vdXMgQ29hbCIsICJTdWItQml0dW1pbm91cyBDb2FsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZXJtYWwgQ29hbCIsICJMaWduaXRlIENvYWwiKSwgIkNvYWwiLAogICAgICAiT3RoZXIiCiAgICApCiAgKQopCgojY29udmVydCBhbmQgcmV2ZXJzZSBvcmRlciBmb3Igc3RhY2tpbmcKZGF0YV9hcmVhJHJlc291cmNlX3R5cGUgPC0gZmFjdG9yKGRhdGFfYXJlYSRyZXNvdXJjZV90eXBlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk90aGVyIiwgIkdhcyIsICJPaWwiLCAiQ29hbCIpKSAgCiMgY29tYmluZSBOYXRpb24gYW5kIHN0YXRlLW93bmVkCmZpbHRlcmVkX2RhdGFfYXJlYSA8LSBkYXRhX2FyZWEgJT4lCiAgZmlsdGVyKHBhcmVudF90eXBlICVpbiUgYygiTmF0aW9uIFN0YXRlIiwgIlN0YXRlLW93bmVkIEVudGl0eSIpKQoKIyBzdW0gb2YgRW1pcyBieSB5ZWFyK3R5cGUKc3VtbWFyeV9kYXRhX2FyZWEgPC0gZmlsdGVyZWRfZGF0YV9hcmVhICU+JQogIGZpbHRlcighaXMubmEodG90YWxfZW1pc3Npb25zX010Q08yZSkpICU+JQogIGdyb3VwX2J5KHllYXIsIHJlc291cmNlX3R5cGUpICU+JQogIHN1bW1hcmlzZShlbWlzc2lvbnNfTXRDTzJlID0gc3VtKHRvdGFsX2VtaXNzaW9uc19NdENPMmUsIG5hLnJtID0gVFJVRSkpICU+JQogIHVuZ3JvdXAoKQoKIyBOZWVkIHRvIHN0YWNrIGl0CnN1bW1hcnlfZGF0YV9hcmVhIDwtIHN1bW1hcnlfZGF0YV9hcmVhICU+JQogIGFycmFuZ2UoeWVhciwgcmVzb3VyY2VfdHlwZSkgJT4lCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgbXV0YXRlKAogICAgeW1pbiA9IGN1bXN1bShlbWlzc2lvbnNfTXRDTzJlKSAtIGVtaXNzaW9uc19NdENPMmUsI2xvd2UgIAogICAgeW1heCA9IGN1bXN1bShlbWlzc2lvbnNfTXRDTzJlKSAjdXBwZXIgICAgICAgICAgICAgICAgICAgICAKICApICU+JQogIHVuZ3JvdXAoKQoKIyBFY29ub21pc3Qtc3R5bGUgY29sb3JzCmVjb25vbWlzdF9jb2xvcnMgPC0gYygKICAiQ29hbCIgPSAiI0UzMTIwQiIsICAjIFJlZAogICJPaWwiID0gIiMwMDU2QTMiLCAgICMgQmx1ZQogICJHYXMiID0gIiMwMDhGNDciLCAgICMgR3JlZW4KICAiT3RoZXIiID0gIiNBNUE1QTUiICAjIEdyZXkKKQoKIyBQTE9UCnN0YXRpY19wbG90IDwtIGdncGxvdChzdW1tYXJ5X2RhdGFfYXJlYSwgYWVzKHggPSB5ZWFyLCBncm91cCA9IHJlc291cmNlX3R5cGUpKSArCiAgIyAxIGxheWVyIGZhZGVkIHN0YWNrZWQgYXJlYSBjaGFydAogIGdlb21fcmliYm9uKGFlcygKICAgIHltaW4gPSB5bWluLAogICAgeW1heCA9IHltYXgsCiAgICBmaWxsID0gcmVzb3VyY2VfdHlwZSwKICAgIHRleHQgPSBwYXN0ZTAoCiAgICAgICJZZWFyOiAiLCB5ZWFyLCAKICAgICAgIjxicj5SZXNvdXJjZTogIiwgcmVzb3VyY2VfdHlwZSwgCiAgICAgICI8YnI+RW1pc3Npb246ICIsIHJvdW5kKGVtaXNzaW9uc19NdENPMmUsIDIpCiAgICApCiAgKSwgYWxwaGEgPSAwLjUpICsKICAjIDJuZCBsYXllciBhZGRpbmcgTGluZXMgCiAgZ2VvbV9saW5lKGFlcygKICAgIHkgPSB5bWF4LAogICAgY29sb3IgPSByZXNvdXJjZV90eXBlLAogICAgdGV4dCA9IHBhc3RlMCgKICAgICAgIlllYXI6ICIsIHllYXIsIAogICAgICAiPGJyPlJlc291cmNlOiAiLCByZXNvdXJjZV90eXBlLCAKICAgICAgIjxicj5FbWlzc2lvbjogIiwgcm91bmQoZW1pc3Npb25zX010Q08yZSwgMikKICAgICkKICApLCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAgIyBTdXBwcmVzcyBsZWdlbmQgZm9yIGxpbmVzCiAgIyAzcmQgbGF5ZXIgYWRkaW5nIGxhYmVsIHRvIGEgbGluZQogIGxhYnMoCiAgICB0aXRsZSA9ICJZZWFybHkgRW1pc3Npb25zIGZvciBOYXRpb24gYW5kIFN0YXRlIG93bmVkIiwKICAgIHggPSAiWWVhciIsCiAgICB5ID0gIlRvdGFsIEVtaXNzaW9ucyBpbiBNdENPMiIsCiAgICBmaWxsID0gIlJlc291cmNlIFR5cGUiLAogICAgY29sb3IgPSAiUmVzb3VyY2UgVHlwZSIKICApICsKICAjIGNvbG9yaW5nCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gZWNvbm9taXN0X2NvbG9ycykgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBlY29ub21pc3RfY29sb3JzKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgTkEpLCBleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwgMC4wNSkpKSArCiAgI2dlbmVyYWwgbG9vawogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpICsKICB0aGVtZSgKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gTkEpLAogICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXk4MCIsIGxpbmV0eXBlID0gImRvdHRlZCIpLAogICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gTkEpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIikKICApCgojIGNvbnZlcnQgdG8gYW4gaW50ZXJhY3RpdmUgcGxvdAppbnRlcmFjdGl2ZV9wbG90IDwtIGdncGxvdGx5KHN0YXRpY19wbG90LCB0b29sdGlwID0gInRleHQiKSAlPiUKICBsYXlvdXQoCiAgICBsZWdlbmQgPSBsaXN0KAogICAgICB0aXRsZSA9IGxpc3QodGV4dCA9ICJSZXNvdXJjZSBUeXBlIiksIAogICAgICBvcmllbnRhdGlvbiA9ICJ2IgogICAgKSwKICAgIHNob3dsZWdlbmQgPSBUUlVFCiAgKQoKIyBSZW5hbWUgbGVnZW5kIGl0ZW1zIHRvIGNsZWFuIGxhYmVscwppbnRlcmFjdGl2ZV9wbG90JHgkZGF0YSA8LSBsYXBwbHkoaW50ZXJhY3RpdmVfcGxvdCR4JGRhdGEsIGZ1bmN0aW9uKHRyYWNlKSB7CiAgaWYgKCFpcy5udWxsKHRyYWNlJGxlZ2VuZGdyb3VwKSkgewogICAgdHJhY2UkbmFtZSA8LSBnc3ViKCIsMSIsICIiLCB0cmFjZSRuYW1lKSAgIyBSZW1vdmUgIiwxIgogICAgdHJhY2UkbmFtZSA8LSBnc3ViKCJcXCgiLCAiIiwgdHJhY2UkbmFtZSkgICMgUmVtb3ZlICIoIgogICAgdHJhY2UkbmFtZSA8LSBnc3ViKCJcXCkiLCAiIiwgdHJhY2UkbmFtZSkgICMgUmVtb3ZlICIpIgogIH0KICB0cmFjZQp9KQoKCmludGVyYWN0aXZlX3Bsb3QKYGBgCgojIyBZZWFybHkgZW1pc3Npb25zIGJ5IHJlc291cmNlIHR5cGUKClRoZSB0cmVuZHMgb2JzZXJ2ZWQgaW4gaW52ZXN0b3Itb3duZWQgY29tcGFuaWVzIGV4aGliaXQgc2ltaWxhcml0aWVzIHRvIHRob3NlIG9mIHN0YXRlIG9yIG5hdGlvbi1vd25lZCBlbnRpdGllcywgeWV0IG5vdGFibGUgZGlzdGluY3Rpb25zIGV4aXN0LiBUb3RhbCBlbWlzc2lvbnMgZnJvbSBpbnZlc3Rvci1vd25lZCBmaXJtcyBhcmUgY29tcGFyYXRpdmVseSBsb3dlciB0aGFuIHRob3NlIGZyb20gdGhlaXIgc3RhdGUvbmF0aW9uLW93bmVkIGNvdW50ZXJwYXJ0cy4gVGhlIGVtaXNzaW9ucyBwcm9maWxlIG9mIHRoZXNlIGNvbXBhbmllcyBpcyBwcmltYXJpbHkgaW5mbHVlbmNlZCBieSBvaWwgYW5kIGdhcywgd2l0aCBjb2FsIGNvbnRyaWJ1dGluZyBtaW5pbWFsbHkuIFRoaXMgc3VnZ2VzdHMgYSBwcm9ub3VuY2VkIGVtcGhhc2lzIG9uIG1hcmtldC1kcml2ZW4gcmVzb3VyY2VzLCBzdWNoIGFzIG9pbCBhbmQgZ2FzLCB3aGljaCB0ZW5kIHRvIHlpZWxkIGhpZ2hlciBwcm9maXRzIHdpdGhpbiB0aGUgcHJpdmF0ZSBzZWN0b3IuCgpJbiBpbnZlc3Rvci1vd25lZCBmaXJtcywgb2lsIGVtaXNzaW9ucyBhcmUgcGFydGljdWxhcmx5IHByb21pbmVudCwgcGVha2luZyBpbiBjb25qdW5jdGlvbiB3aXRoIGdsb2JhbCBpbmR1c3RyaWFsIGFuZCB0cmFuc3BvcnRhdGlvbiBleHBhbnNpb25zLiBUaGUgcHJpdmF0ZSBzZWN0b3IncyB0ZW5kZW5jeSB0b3dhcmRzIG9pbCBpcyBhIHNpZ24gb2YgaXRzIHByb2ZpdGFiaWxpdHkgYW5kIHJvYnVzdCBkZW1hbmQgaW4gaW50ZXJuYXRpb25hbCBtYXJrZXRzLiBBbHRob3VnaCBnYXMgYWxzbyBwbGF5cyBhIHNpZ25pZmljYW50IHJvbGUsIGl0IHJlbWFpbnMgc2Vjb25kYXJ5IHRvIG9pbC4gSXRzIGltcG9ydGFuY2UgaGFzIGdyb3duIGluIHJlY2VudCBkZWNhZGVzIGFzIHByaXZhdGUgZW50ZXJwcmlzZXMgbGV2ZXJhZ2UgaXRzIHJpc2luZyBkZW1hbmQgYXMgYSAidHJhbnNpdGlvbiBmdWVsLiIgQ29udmVyc2VseSwgY29hbCdzIGNvbnRyaWJ1dGlvbiBpcyBjb25zaWRlcmFibHkgZGltaW5pc2hlZCwgcmVmbGVjdGluZyB0aGUgcHJpdmF0ZSBzZWN0b3IncyBncmFkdWFsIHNoaWZ0IGF3YXkgZnJvbSBjb2FsIGluIHJlc3BvbnNlIHRvIHJlZ3VsYXRvcnkgY2hhbGxlbmdlcyBhbmQgZGVjcmVhc2luZyBwcm9maXRhYmlsaXR5LgoKSW4gY29udHJhc3QsIHN0YXRlIG9yIG5hdGlvbi1vd25lZCBlbnRpdGllcyBleGhpYml0IHNpZ25pZmljYW50bHkgaGlnaGVyIHRvdGFsIGVtaXNzaW9ucywgd2l0aCBjb2FsIGJlaW5nIHRoZSBwcmVkb21pbmFudCBzb3VyY2UsIHdoaWxlIG9pbCBhbmQgZ2FzIGFsc28gY29udHJpYnV0ZSBzdWJzdGFudGlhbGx5LiBUaGVzZSBlbnRpdGllcyBkZW1vbnN0cmF0ZSBhIHNsb3dlciBwYWNlIGluIG1vdmluZyBhd2F5IGZyb20gZm9zc2lsIGZ1ZWxzLCBwYXJ0aWN1bGFybHkgY29hbCwgd2hpY2ggbWF5IGJlIGF0dHJpYnV0ZWQgdG8gcG9saXRpY2FsIGluZXJ0aWEsIGV4aXN0aW5nIGluZnJhc3RydWN0dXJlLCBhbmQgZWNvbm9taWMgZGVwZW5kZW5jZSBvbiBzdGF0ZS1tYW5hZ2VkIHJlc291cmNlcy4gV2hpbGUgaW52ZXN0b3Itb3duZWQgY29tcGFuaWVzIHJlbWFpbiBoZWF2aWx5IHJlbGlhbnQgb24gb2lsIGFuZCBnYXMsIHRoZXkgYXBwZWFyIHRvIGJlIG1vcmUgYWdpbGUgaW4gYWRhcHRpbmcgdG8gbWFya2V0IGR5bmFtaWNzIGFuZCByZWd1bGF0b3J5IGluZmx1ZW5jZXMsIHBvdGVudGlhbGx5IGZhY2lsaXRhdGluZyBhIG1vcmUgcmFwaWQgdHJhbnNpdGlvbiB0b3dhcmRzIGNsZWFuZXIgZW5lcmd5IGFsdGVybmF0aXZlcy4KYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCiNvcGVuIHRoZSBkYXRhCiNmaWxlX3BhdGggPC0gIn4vRGVza3RvcC9ScHJvamVjdC9FbWlzc2lvbnNfbS5jc3YiICAKZGF0YV9hcmVhMSA8LSBlbWlzc2lvbnMKIyBDYXRlZ29yaXplIHRoZSBjb21tb2RpdGllcwpkYXRhX2FyZWExJHJlc291cmNlX3R5cGUxIDwtIGlmZWxzZSgKICBkYXRhX2FyZWExJGNvbW1vZGl0eSA9PSAiT2lsICYgTkdMIiwgIk9pbCIsCiAgaWZlbHNlKAogICAgZGF0YV9hcmVhMSRjb21tb2RpdHkgPT0gIk5hdHVyYWwgR2FzIiwgIkdhcyIsCiAgICBpZmVsc2UoCiAgICAgIGRhdGFfYXJlYTEkY29tbW9kaXR5ICVpbiUgYygiTWV0YWxsdXJnaWNhbCBDb2FsIiwgIkFudGhyYWNpdGUgQ29hbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQml0dW1pbm91cyBDb2FsIiwgIlN1Yi1CaXR1bWlub3VzIENvYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlcm1hbCBDb2FsIiwgIkxpZ25pdGUgQ29hbCIpLCAiQ29hbCIsCiAgICAgICJPdGhlciIKICAgICkKICApCikKCiMgQ29udmVydCDigaDigK9yZXNvdXJjZV90eXBlMeKAr+KBoCB0byBhIGZhY3RvciB3aXRoIHRoZSBkZXNpcmVkIHN0YWNraW5nIG9yZGVyCmRhdGFfYXJlYTEkcmVzb3VyY2VfdHlwZTEgPC0gZmFjdG9yKGRhdGFfYXJlYTEkcmVzb3VyY2VfdHlwZTEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJPdGhlciIsICJHYXMiLCAiQ29hbCIsICJPaWwiKSkKCiMgRmlsdGVyIGZvciBJbnZlc3Rvci1vd25lZCBjb21wYW5pZXMgb25seQpmaWx0ZXJlZF9kYXRhX2FyZWExIDwtIGRhdGFfYXJlYTEgJT4lCiAgZmlsdGVyKHBhcmVudF90eXBlID09ICJJbnZlc3Rvci1vd25lZCBDb21wYW55IikKCiMgU3VtbWFyaXplIGVtaXNzaW9ucyBieSB5ZWFyIGFuZCByZXNvdXJjZSB0eXBlCnN1bW1hcnlfZGF0YV9hcmVhMSA8LSBmaWx0ZXJlZF9kYXRhX2FyZWExICU+JQogIGZpbHRlcighaXMubmEodG90YWxfZW1pc3Npb25zX010Q08yZSkpICU+JQogIGdyb3VwX2J5KHllYXIsIHJlc291cmNlX3R5cGUxKSAlPiUKICBzdW1tYXJpc2UoZW1pc3Npb25zX010Q08yZTEgPSBzdW0odG90YWxfZW1pc3Npb25zX010Q08yZSwgbmEucm0gPSBUUlVFKSkgJT4lCiAgdW5ncm91cCgpCgojIENhbGN1bGF0ZSBzdGFja2luZyAoY3VtdWxhdGl2ZSBlbWlzc2lvbnMpCnN1bW1hcnlfZGF0YV9hcmVhMSA8LSBzdW1tYXJ5X2RhdGFfYXJlYTEgJT4lCiAgYXJyYW5nZSh5ZWFyLCByZXNvdXJjZV90eXBlMSkgJT4lCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgbXV0YXRlKAogICAgeW1pbiA9IGN1bXN1bShlbWlzc2lvbnNfTXRDTzJlMSkgLSBlbWlzc2lvbnNfTXRDTzJlMSwgICMgTG93ZXIgYm91bmQgb2YgdGhlIHJpYmJvbgogICAgeW1heCA9IGN1bXN1bShlbWlzc2lvbnNfTXRDTzJlMSkgICAgICAgICAgICAgICAgICAgICAgIyBVcHBlciBib3VuZCBvZiB0aGUgcmliYm9uCiAgKSAlPiUKICB1bmdyb3VwKCkKCiMgRWNvbm9taXN0LXN0eWxlIGNvbG9ycwplY29ub21pc3RfY29sb3JzIDwtIGMoCiAgIk9pbCIgPSAiIzAwNTZBMyIsICAgIyBCbHVlCiAgIkNvYWwiID0gIiNFMzEyMEIiLCAgIyBSZWQKICAiR2FzIiA9ICIjMDA4RjQ3IiwgICAjIEdyZWVuCiAgIk90aGVyIiA9ICIjQTVBNUE1IiAgIyBHcmV5CikKCiMgUGxvdApzdGF0aWNfcGxvdDEgPC0gZ2dwbG90KHN1bW1hcnlfZGF0YV9hcmVhMSwgYWVzKHggPSB5ZWFyLCBncm91cCA9IHJlc291cmNlX3R5cGUxKSkgKwogICMgMS4gRmFkZWQgc3RhY2tlZCBhcmVhIGNoYXJ0CiAgZ2VvbV9yaWJib24oYWVzKAogICAgeW1pbiA9IHltaW4sCiAgICB5bWF4ID0geW1heCwKICAgIGZpbGwgPSByZXNvdXJjZV90eXBlMSwKICAgIHRleHQgPSBwYXN0ZTAoCiAgICAgICJZZWFyOiAiLCB5ZWFyLCAKICAgICAgIjxicj5SZXNvdXJjZTogIiwgcmVzb3VyY2VfdHlwZTEsIAogICAgICAiPGJyPkVtaXNzaW9uOiAiLCByb3VuZChlbWlzc2lvbnNfTXRDTzJlMSwgMikKICAgICkKICApLCBhbHBoYSA9IDAuNSkgKwogICMgMi4gTGluZSBjaGFydCBmb3IgdGhlIHRvcCBvZiBlYWNoIHJpYmJvbgogIGdlb21fbGluZShhZXMoCiAgICB5ID0geW1heCwKICAgIGNvbG9yID0gcmVzb3VyY2VfdHlwZTEsCiAgICB0ZXh0ID0gcGFzdGUwKAogICAgICAiWWVhcjogIiwgeWVhciwgCiAgICAgICI8YnI+UmVzb3VyY2U6ICIsIHJlc291cmNlX3R5cGUxLCAKICAgICAgIjxicj5FbWlzc2lvbjogIiwgcm91bmQoZW1pc3Npb25zX010Q08yZTEsIDIpCiAgICApCiAgKSwgc2l6ZSA9IDEsIHNob3cubGVnZW5kID0gRkFMU0UpICsgICMgU3VwcHJlc3MgbGVnZW5kIGZvciBsaW5lcwogICMgMy4gTGFiZWxzCiAgbGFicygKICAgIHRpdGxlID0gIlllYXJseSBFbWlzc2lvbnMgZm9yIEludmVzdG9yLW93bmVkIENvbXBhbmllcyIsCiAgICB4ID0gIlllYXIiLAogICAgeSA9ICJUb3RhbCBFbWlzc2lvbnMgaW4gTXRDTzIiLAogICAgZmlsbCA9ICJSZXNvdXJjZSBUeXBlIiwKICAgIGNvbG9yID0gIlJlc291cmNlIFR5cGUiCiAgKSArCiAgIyBDb2xvcnMgZm9yIGJvdGggYXJlYXMgYW5kIGxpbmVzCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gZWNvbm9taXN0X2NvbG9ycykgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBlY29ub21pc3RfY29sb3JzKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgTkEpLCBleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwgMC4wNSkpKSArCiAgIyBTdHlsaW5nCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkgKwogIHRoZW1lKAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSBOQSksCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JleTgwIiwgbGluZXR5cGUgPSAiZG90dGVkIiksCiAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSBOQSksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKQogICkKCiMgQ29udmVydCB0byBpbnRlcmFjdGl2ZSBwbG90CmludGVyYWN0aXZlX3Bsb3QxIDwtIGdncGxvdGx5KHN0YXRpY19wbG90MSwgdG9vbHRpcCA9ICJ0ZXh0IikgJT4lCiAgbGF5b3V0KAogICAgbGVnZW5kID0gbGlzdCgKICAgICAgdGl0bGUgPSBsaXN0KHRleHQgPSAiUmVzb3VyY2UgVHlwZSIpLCAKICAgICAgb3JpZW50YXRpb24gPSAidiIKICAgICksCiAgICBzaG93bGVnZW5kID0gVFJVRQogICkKCiMgUmVuYW1lIGxlZ2VuZCBpdGVtcyB0byBjbGVhbiBsYWJlbHMKaW50ZXJhY3RpdmVfcGxvdDEkeCRkYXRhIDwtIGxhcHBseShpbnRlcmFjdGl2ZV9wbG90MSR4JGRhdGEsIGZ1bmN0aW9uKHRyYWNlKSB7CiAgaWYgKCFpcy5udWxsKHRyYWNlJGxlZ2VuZGdyb3VwKSkgewogICAgdHJhY2UkbmFtZSA8LSBnc3ViKCIsMSIsICIiLCB0cmFjZSRuYW1lKSAgIyBSZW1vdmUgIiwxIgogICAgdHJhY2UkbmFtZSA8LSBnc3ViKCJcXCgiLCAiIiwgdHJhY2UkbmFtZSkgICMgUmVtb3ZlICIoIgogICAgdHJhY2UkbmFtZSA8LSBnc3ViKCJcXCkiLCAiIiwgdHJhY2UkbmFtZSkgICMgUmVtb3ZlICIpIgogIH0KICB0cmFjZQp9KQoKIyBEaXNwbGF5IGludGVyYWN0aXZlIHBsb3QKaW50ZXJhY3RpdmVfcGxvdDEKYGBgCiMgQ29uY2x1c2lvbgoKVGhlIGV4YW1pbmF0aW9uIG9mIHByb2R1Y3Rpb24gdmFsdWVzIGFuZCBlbWlzc2lvbnMgdHJlbmRzIGFjcm9zcyBkaWZmZXJlbnQgY29tbW9kaXRpZXMgcmV2ZWFscyBzaWduaWZpY2FudCBwYXR0ZXJucyBpbiByZXNvdXJjZSB1c2UsIGluZHVzdHJpYWwgZGV2ZWxvcG1lbnQsIGFuZCBlbnZpcm9ubWVudGFsIHJlcGVyY3Vzc2lvbnMgb3ZlciB0aW1lLgoKQ29hbCwgZXNwZWNpYWxseSBCaXR1bWlub3VzIGFuZCBUaGVybWFsIENvYWwsIHdhcyBlc3NlbnRpYWwgZHVyaW5nIHRoZSBpbml0aWFsIHN0YWdlcyBvZiBpbmR1c3RyaWFsaXNhdGlvbi4gQWx0aG91Z2ggaXRzIHByb3BvcnRpb24gaW4gdG90YWwgZW5lcmd5IHByb2R1Y3Rpb24gaGFzIGRpbWluaXNoZWQsIGl0IGNvbnRpbnVlcyB0byBob2xkIGltcG9ydGFuY2UsIHBhcnRpY3VsYXJseSBpbiBkZXZlbG9waW5nIG5hdGlvbnMgYW5kIHN0YXRlLWRyaXZlbiBlbmVyZ3kgZnJhbWV3b3Jrcy4gU2luY2UgdGhlIG1pZC0yMHRoIGNlbnR1cnksIG9pbCBhbmQgbmF0dXJhbCBnYXMgbGlxdWlkcyBoYXZlIGNvbnNpc3RlbnRseSBsZWQgaW4gYm90aCBwcm9kdWN0aW9uIGFuZCBlbWlzc2lvbnMsIGxhcmdlbHkgZHVlIHRvIHRoZWlyIGtleSByb2xlIGluIHRyYW5zcG9ydGF0aW9uLCBlbmVyZ3kgZ2VuZXJhdGlvbiwgYW5kIGluZHVzdHJpYWwgcHJvY2Vzc2VzLiBOYXR1cmFsIGdhcyBoYXMgZW1lcmdlZCBhcyBhIHByb21pbmVudCBhbHRlcm5hdGl2ZSB0byBjb2FsLCBwcm92aWRpbmcgY2xlYW5lciBlbmVyZ3kgd2l0aCByZWR1Y2VkIGVtaXNzaW9ucyB3aGlsZSBtYWludGFpbmluZyBpbmNyZWFzaW5nIHByb2R1Y3Rpb24uIENvbnNlcXVlbnRseSwgdGhlIHBlcmlvZCBmb2xsb3dpbmcgV29ybGQgV2FyIElJIG1hcmtlZCBhIHNpZ25pZmljYW50IHRyYW5zaXRpb24gZnJvbSBjb2FsIHRvIG9pbCBhbmQgZ2FzIGFzIHRoZSBwcmltYXJ5IGVuZXJneSBzb3VyY2VzLCBpbmZsdWVuY2VkIGJ5IHRlY2hub2xvZ2ljYWwgcHJvZ3Jlc3MsIHVyYmFuaXNhdGlvbiwgYW5kIGVjb25vbWljIGdsb2JhbGlzYXRpb24uCgpFbWlzc2lvbnMgZnJvbSBzdGF0ZS1jb250cm9sbGVkIGVudGl0aWVzIGFyZSBwcmVkb21pbmFudGx5IHJlbGlhbnQgb24gY29hbCwgcmVmbGVjdGluZyBleHRlbnNpdmUgZG9tZXN0aWMgZW5lcmd5IGluaXRpYXRpdmVzIGFpbWVkIGF0IGVuc3VyaW5nIGVuZXJneSBzZWN1cml0eSBhbmQgZm9zdGVyaW5nIGVjb25vbWljIGdyb3d0aC4gVGhpcyBkZXBlbmRlbmNlIG9uIGNvYWwgcmVzdWx0cyBpbiBjb25zaWRlcmFibHkgaGlnaGVyIGVtaXNzaW9ucyBjb21wYXJlZCB0byB0aG9zZSBmcm9tIGludmVzdG9yLW93bmVkIGZpcm1zLiBJbiBjb250cmFzdCwgcHJpdmF0ZSBzZWN0b3IgY29tcGFuaWVzIHRlbmQgdG8gbWFpbnRhaW4gYSBtb3JlIGRpdmVyc2lmaWVkIGVuZXJneSBwb3J0Zm9saW8sIGRyYXdpbmcgYXR0ZW50aW9uIHRvIG9pbCBhbmQgZ2FzIGR1ZSB0byB0aGVpciBwcm9maXRhYmlsaXR5IGFuZCBtYXJrZXQgZGVtYW5kLiBUaGVzZSBjb21wYW5pZXMgYXJlIGFsc28gbW9yZSBhZGFwdGFibGUgdG8gcmVndWxhdG9yeSBwcmVzc3VyZXMsIHJlc3VsdGluZyBpbiBhIGxvd2VyIHJlbGlhbmNlIG9uIGNvYWwuCgpFbWlzc2lvbnMgdHJlbmRzIGNsb3NlbHkgZm9sbG93IHByb2R1Y3Rpb24gcGF0dGVybnMsIHdpdGggcGVha3MgaW4gY29hbC1yZWxhdGVkIGVtaXNzaW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbmR1c3RyaWFsIGV4cGFuc2lvbiBvZiB0aGUgbWlkLTIwdGggY2VudHVyeSwgd2hpbGUgb2lsIGFuZCBnYXMgZW1pc3Npb25zIHJlYWNoZWQgdGhlaXIgcGVha3MgbGF0ZXIuIFRoZSBncmFkdWFsIGluY3JlYXNlIGluIG5hdHVyYWwgZ2FzIHByb2R1Y3Rpb24gc2lnbmlmaWVzIGl0cyByb2xlIGFzIGEgInRyYW5zaXRpb24gZnVlbCwiIG9mZmVyaW5nIGxvd2VyIGVtaXNzaW9ucyB0aGFuIGNvYWwgd2hpbGUgc3RpbGwgY29udHJpYnV0aW5nIHRvIG92ZXJhbGwgY2FyYm9uIG91dHB1dC4KClRoZSBpbnRlZ3JhdGVkIGFuYWx5c2lzIG9mIHByb2R1Y3Rpb24gYW5kIGVtaXNzaW9ucyBkYXRhIHVuZGVyc2NvcmVzIHRoZSBpbnRyaWNhdGUgbmF0dXJlIG9mIGdsb2JhbCByZXNvdXJjZSBjb25zdW1wdGlvbiBhbmQgaXRzIGVudmlyb25tZW50YWwgaW1wYWN0cy4gV2hpbGUgdGhlcmUgaXMgYSBub3RpY2VhYmxlIHRyYW5zaXRpb24gdG93YXJkcyBjbGVhbmVyIGVuZXJneSBzb3VyY2VzLCBleGVtcGxpZmllZCBieSB0aGUgaW5jcmVhc2VkIHVzZSBvZiBuYXR1cmFsIGdhcyBhbmQgYSByZWR1Y3Rpb24gaW4gY29hbCBkZXBlbmRlbmN5LCB0aGlzIHByb2dyZXNzIGlzIGluYWRlcXVhdGUgdG8gYWNoaWV2ZSB0aGUgb3ZlcmFyY2hpbmcgZ2xvYmFsIGNsaW1hdGUgb2JqZWN0aXZlcy4KCg==